2017-09-17 13 views
1

이 질문에 대한 답을 알고 있지만 단계는 설명하지 않았다. 단계 및 또는 철저하게 나를 그 실행 방법을 이해하기에 충분가 그래서, 코드의이 부분을 가지고 말 :"while ((ch = getchar())! = ' n'&& c! = EOF;"

char ch; 
while((ch = getchar()) != '\n' && ch != EOF); 

은 getchar가()가 채널 변수 1에 하나의 문자를 읽고 다음을합니까 비교, 즉, ch != '\n' && ch != EOF, 줄 바꿈 이스케이프 시퀀스를 버퍼링하지만 실제로는 ch 변수에 남겨 두지 않습니까? 그렇다면 개행 이스케이프 시퀀스/EOF가 발생할 때까지 무한 루프가 발생합니다. 개행 이스케이프 시퀀스가 ​​발생하면 ch 변수에 저장됩니까? 어떻게하지?

+0

시작 밖으로 당신의 방법을 작동 :

수정은 intch을 선언하는 것입니다. 스트림을 소비하는'getchar()'호출 by에서'ch '로의 할당은 "newline 이스케이프 시퀀스를 버퍼에 남긴 채로 남겨두고 ch 변수에 실제로는 없다"라는 전체 이론을 과장한다. – WhozCraig

+3

코드가 깨졌습니다. 'getchar'는 이유 때문에'int' (char가 아니라)를 리턴합니다. – melpomene

+0

"개행 이스케이프 시퀀스"라고 할 때 무슨 뜻인지 이해하지 못합니다. '\ n' (역 슬래시 - n)과 같은 이스케이프 시퀀스는 C 소스 코드의 기능입니다. 그것은 런타임에 데이터에 존재하는 것이 아닙니다. – melpomene

답변

7
char ch; 

먼저 우리는 유형 charch 변수를 정의합니다.

while((ch = getchar()) != '\n' && ch != EOF); 

이것은 루프 while입니다. 루프 조건은 (ch = getchar()) != '\n' && ch != EOF이고 루프 본문은 ; (Null 문)입니다.

루프 조건은 && (논리 "and")과 두 개의 피연산자, (ch = getchar()) != '\n'ch != EOF으로 구성됩니다. && 연산자는 항상 왼쪽 피연산자를 먼저 계산합니다.

(ch = getchar()) != '\n'은 부등식 비교입니다. 오른쪽은 '\n' (개행 문자를 나타냄)입니다. 왼쪽은 할당 표현 인 ch = getchar()입니다.

getchar()stdin (표준 입력)에서 문자를 읽는 getchar 함수를 호출합니다. 성공하면이 문자는 unsigned char (대개 0 ... 255 범위) 형식으로 반환됩니다. 그렇지 않은 경우 (getchar이 실패한 경우) EOF (구현 관련) 음수 값을 반환합니다. 이것이 반환 유형 getcharint 인 이유입니다. 모든 유효한 문자 값 을 오류 표시기로 나타내야합니다.

이 값은 ch에 저장됩니다.

  1. char이 구현의 부호 유형 :이 시점에서 두 가지 가능성이있다. 이 경우 성공적으로 읽은 모든 문자는 그대로 저장되지만 EOF은 일부 일반 문자에 매핑됩니다. (보통 때와 마찬가지로) EOF의 값이 -1이면 UCHAR_MAX (일반적으로 255)가됩니다.

  2. char은 구현시 서명 된 유형입니다. 이 경우 모든 가능한 문자 값의 절반이 범위를 벗어납니다 (일반적으로 char은 -128 .. 127의 범위를 가지며 128 .. 255의 값을 저장할 수 없습니다). 여기에는 약간의 퍼지가 있습니다. 범위를 벗어나는 문자는 (구현에 따라 정의 된) 신호로 나타나거나 다른 (구현에 따라 정의 된) 문자로 변환됩니다. 반면에 EOF은 그대로 유지됩니다 (이 경우 값이 CHAR_MIN보다 작지 않으면 이전과 같이 구현 정의 신호 또는 변환이 발생합니다).

할당 표현식은 할당 후 왼쪽 피연산자 값을 갖습니다. 따라서 (ch = getchar())은 새 값 ch (위에서 설명한대로 입력 된 문자)을 반환합니다. 이 문자를 '\n' (줄 바꿈)과 비교합니다. 개행 문자 인 경우 !=은 false를 반환하고 &&은 즉시 false를 반환하고 루프가 중지됩니다. 그 오른쪽을 평가하기 위해 입력 문자가 개행 문자가 아닌 경우,

(즉, 구현, 다른 문자 또는 EOF 때문에 위에서 설명한 맹 글링의 '\n'로 misdetected 될 수에 따라 다릅니다. 참고) != 사실 산출 및 && 진행 hand 피연산자. 여기서 우리는 ch != EOF을 비교합니다. 우리가 # 1의 경우 (즉, char이 부호없는 유형 인 경우) EOF이 음수 값이기 때문에이 비교는 항상 참입니다 (우리가 좀 더 이국적인 상황에 있지 않는 한 char/int이 가능한 동일한 크기/범위의 값을 가짐) , 나는 그것에 들어가 가지 않을 것이다). 숫자가 2 인 경우 (즉, char이 서명 된 유형 인 경우) getcharEOF 인 경우 (즉, 입력이 끝났거나 오류가 발생한 경우) 루프가 중지되면이 비교는 false를 반환합니다. 특정 문자 (보통 UCHAR_MAX, 255)를 EOF으로 오인 할 수도 있습니다. 그렇지 않으면 (즉, ch'\n' 또는 이 아닌 경우) 루프가 반복되고 다음 문자가 읽고 검사됩니다.

이 코드의 의도는 개행 또는 입력 끝에 도달 할 때까지 입력을 소비하고 버리는 것입니다.

그러나 때문에 코드가 작성되는 방식의

는 (입력의 끝에 도달 할 때 영원히 따라서 루프), 그것은 실제로 하나 EOF를 인식하지 않거나 EOF으로 유효한 입력을 처리 (따라서 조기 종료). 가장 안쪽 괄호와

int ch;