char ch;
먼저 우리는 유형 char
의 ch
변수를 정의합니다.
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
(구현 관련) 음수 값을 반환합니다. 이것이 반환 유형 getchar
이 int
인 이유입니다. 모든 유효한 문자 값 과을 오류 표시기로 나타내야합니다.
이 값은 ch
에 저장됩니다.
char
이 구현의 부호 유형 :이 시점에서 두 가지 가능성이있다. 이 경우 성공적으로 읽은 모든 문자는 그대로 저장되지만 EOF
은 일부 일반 문자에 매핑됩니다. (보통 때와 마찬가지로) EOF
의 값이 -1
이면 UCHAR_MAX
(일반적으로 255)가됩니다.
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
이 서명 된 유형 인 경우) getchar
이 EOF
인 경우 (즉, 입력이 끝났거나 오류가 발생한 경우) 루프가 중지되면이 비교는 false를 반환합니다. 특정 문자 (보통 UCHAR_MAX
, 255)를 EOF
으로 오인 할 수도 있습니다. 그렇지 않으면 (즉, ch
이 '\n'
또는 이 아닌 경우) 루프가 반복되고 다음 문자가 읽고 검사됩니다.
이 코드의 의도는 개행 또는 입력 끝에 도달 할 때까지 입력을 소비하고 버리는 것입니다.
그러나 때문에 코드가 작성되는 방식의
는 (입력의 끝에 도달 할 때 영원히 따라서 루프), 그것은 실제로 하나
EOF
를 인식하지 않거나
EOF
으로 유효한 입력을 처리 (따라서 조기 종료). 가장 안쪽 괄호와
int ch;
시작 밖으로 당신의 방법을 작동 :
수정은
int
로ch
을 선언하는 것입니다. 스트림을 소비하는'getchar()'호출 by에서'ch '로의 할당은 "newline 이스케이프 시퀀스를 버퍼에 남긴 채로 남겨두고 ch 변수에 실제로는 없다"라는 전체 이론을 과장한다. – WhozCraig코드가 깨졌습니다. 'getchar'는 이유 때문에'int' (char가 아니라)를 리턴합니다. – melpomene
"개행 이스케이프 시퀀스"라고 할 때 무슨 뜻인지 이해하지 못합니다. '\ n' (역 슬래시 - n)과 같은 이스케이프 시퀀스는 C 소스 코드의 기능입니다. 그것은 런타임에 데이터에 존재하는 것이 아닙니다. – melpomene