2017-02-07 3 views
3

나는 R. 에게 K &에 문제를 문제 1.6을 해결하기 위해 노력했다입니다 -C = (! getchar가() = EOF)

  • 표현 getchar() != EOF인지 확인 0 또는 1

#include <stdio.h> 

int main(){ 
    int expr_val, c; 
    printf("Input a character and press enter: "); 
    expr_val = (getchar() != EOF); 
    printf("expr_val: %d\n", expr_val); 

    return 0; 
} 

난 아무것도에 입력, 그것이 내가 execut 1의 값을 반환

나는 작동하는 솔루션을 발견 EOF (Ctrl + D)를 누르면 0의 값이 반환됩니다.

그러나 코드에서 EOF를 숫자 3으로 바꾸면 프로그램이 예상대로 작동하지 않습니다. 입력 값이 5이면 1을 반환하고, 3을 입력하면 1을 반환합니다.

제 생각에 3 값을 입력하면 값이 반환됩니다. 내가 5.

의 값을 입력하면 내가받을 값보다 다른이

#include <stdio.h> 

int main(){ 
    int expr_val, c; 
    printf("Input a character and press enter: "); 
    expr_val = (getchar() != 3); 
    printf("expr_val: %d\n", expr_val); 

    return 0; 
} 

사람이이 경우 이유에 대해 가르치 려 수 (나는 단지 3에 EOF를 변경)?


감사합니다. 여러분의 답변은 모두 매우 명확하고 도움이되었습니다. EOF를 '3'또는 51로 변경하면 코드가 제대로 작동합니다.

+8

'3'과 '3'이 서로 다릅니다.자세한 내용은 [ASCII 테이블] (http://www.asciitable.com/)을 참조하십시오. –

+2

'expr_val = (getchar()! = 'A');'그리고 타입'A'. – chux

+2

K & R 질문은 최소한 표준 C와 관련해서는 다소 바보입니다. 관계 연산자 (예 :'! = '연산자로 수행)의 결과는 정의에 따라 0 또는 1입니다. –

답변

2

정수와 문자를 혼동합니다.

3은 정수 3이 아니며 정수입니다. '3'은 C.의 문자 3입니다.

문서 here.

3

getchar() 함수는 파일 또는 오류의 끝에 int 로의 부호없는 char 캐스트 또는 EOF로 읽은 문자를 반환합니다.

그래서, 당신은 단지 대신 3의 ('3'문자) 비교를 변경하고 '3'를 사용해야하거나 자리 (51)이다 3의 아스키 값을 사용할 수있다 [참조 ASCII Table]

expr_val = (getchar() != '3'); 

또는

expr_val = (getchar() != 51); 

당신이 입력으로 3를 입력하면 이제 두 경우 모두, 당신은 expr_val = 0을 얻을 것이다.

+0

C는 ASCII를 사용한다고 보장하지 않으므로'expr_val = (getchar()! = 51); '가 잘못되었습니다. 그리고 매직 넘버는 나쁜 습관입니다. – Stargateur

+0

동의합니다. 그 경우 대안을 제안 하시겠습니까? –

+2

왜 대안을 원하십니까? ''3 ''로 충분하다. – Stargateur

-1

아무도 당신은

+2

'atoi'는 널 종료 문자열을 변환합니다. '3'은 '0'을 빼서 '3'으로 변환합니다. 그리고 OP는 어쨌든 그 변환을 할 필요가 없습니다. –

0

(getchar가()! = 3)부울 표현의 사촌의 atoihttps://linux.die.net/man/3/atoi 또는 하나를 변환하는 방법을 '3'(3)로 설명합니다. 주어진 코드는 expr_val에만 0 또는 1을 할당합니다.