2016-11-21 11 views
3

islower()과 친구들이 EOF을 처리해야하는 이유는 무엇입니까? putchar() 및 친구들은 없어도 되나요?왜 islower()와 친구들이 EOF를 처리해야합니까?

islower()int으로 처리되는 이유는 unsigned char인데, 이는 putchar()의 경우입니까? 어쨌든 우선 EOF을 확인해야하기 때문에 이것은 합리적입니다. 참고 : Why the argument type of putchar(), fputc(), and putc() is not char?

+0

'서명되지 않은 문자'는 고대의 것입니다. 길이가 8 비트이기 때문에 악센트가있는 문자, 이모티콘 등으로 비 서구 언어를 사용하지 못합니다. – Codo

+0

@Codo :와 islower()는 표준 라이브러리에서 무엇을합니까? – usr2564301

+0

@RadLexus : 잘 모르겠습니다. 로케일이 올바르게 설정된 경우에는 그렇지 않다고 생각합니다. – Codo

답변

1

EOF을 처리 할 때 문자 유형 기능이 필요하지 않습니다 (즉, false를 반환하는 것). 사실, EOF 표식은 not even mentioned in <ctype.h> header documentation입니다.

char 대신 서명 또는 서명에 int를 사용하는 문자 분류 기능 서명에 대한 가능성이 가장 높은 이유는이 같은 루프에서 구현 정의 동작을 방지하는 것입니다

int c; 
while ((c =getchar()) != EOF) { 
    if (islower(c)) { 
     ... 
    } else if (isdigi(c)) { 
     ... 
    } 
} 

이 컴파일하고 실행 것 islower(int) 대신에 islower(char)이지만, the result would be implementation defined인데, 이러한 기본 상황에서는 바람직하지 않습니다. 본질적으로 getchar의 서명에있는 int은 "전염성"이되어 그와 관련이 거의없는 기능의 서명을 얻습니다.

+2

이 문맥에서 "무시"하는 것은 무엇을 의미합니까? 함수는 EOF를 받아 들여'false'를 반환해야합니다. –

+0

은 EOF가 공백이 아닌 것을 반환 함을 의미합니다. – Nick

+2

또한 "왜 argalent 유형의 isalpha가 int인지"다른 질문에 답했습니다. 실제 질문은 "isalpha가 EOF에 대해 정의되어야하는 이유"입니다. unsigned char에 맞지 않는 다른 int 값의 경우 결과는 정의되지 않습니다. –

4

어쨌든 EOF를 확인해야하기 때문에.

우리는 절대적으로 그러지 않습니다.

int c; 
while(isspace(c=fgetc(fp))); 
if (c==EOF) ... 

이것은 공백을 건너 뛰는 데있어 합법적 인 코드입니다. EOF에 대한 각 문자를 별도로 확인하는 것은 시간 낭비입니다.

ctype 함수는 이와 같이 코드를 활성화 할 수 있도록 EOF를 처리하도록 만들어졌습니다.

도 참조하십시오. this question.

+0

[임의의 구현] (http://research.microsoft.com/en-us/um/redmond/projects/invisible/include/)을 참조하십시오. ctype.h.htm)은'-1'이 * 명시 적으로 *주의해야한다고 제안한다 : #define isspace (c) ((__ctype + 1) [(unsigned int) c] & _ S)'. 여기서,'__ctype'은 간단한 배열입니다 만, 다소 비열한'+ 1'을주의하십시오! – usr2564301

+0

"ctype 함수는 특히 이와 같은 코드를 활성화 할 수 있도록 EOF를 처리하도록 만들어졌습니다." -이 표준은 어디에 쓰여 있습니까? 이것은 당신의 의견입니다. 상황은 그것보다 합리적입니다. –

+0

@IgorLiferenko 표준은 거의 결정의 근거를 언급하지 않으며, 다른 곳으로 가서 찾아야합니다. 민중의 지혜는 하나의 원천입니다. –