2016-11-21 79 views
3

爲什麼islower()和朋友需要處理EOF,而putchar()和朋友不需要?爲什麼islower()和朋友需要處理EOF?

爲什麼不將islower()視爲intunsigned char,如putchar()的情況那樣?這樣做會很有意義,因爲我們必須首先檢查EOF。另請參見Why the argument type of putchar(), fputc(), and putc() is not char?

+0

'unsigned char'是古代的事情。由於它的長度爲8位,不能與非西方語言一起使用,並帶有重音字母,表情符號等。 – Codo

+0

@Codo:和'islower()'在標準庫中有嗎? – usr2564301

+0

@RadLexus:我不太確定。我認爲如果語言環境設置正確的話。 – Codo

回答

1

除了忽略它(即返回false)之外,不需要任何字符類型函數來處理EOF。實際上,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(char)而不是islower(int),但the result would be implementation defined,這在這樣的基本情況下是不可取的。實質上,在getchar簽名中的int變得「具有傳染性」,進入功能的簽名只與其略有關聯。

+2

在這種情況下,「忽略」是什麼意思?這些函數需要接受EOF並返回false。 –

+0

意味着返回的EOF不是空間 – Nick

+2

此外,你已經回答了一個完全不同的問題,「爲什麼isalpha的論證類型是int」。實際的問題是「爲什麼必須爲EOF定義isalpha」。對於任何其他不適合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中。(c)((__ctype + 1)[(unsigned int)c]&_ S)'''''''''''''''''在這裏'__ctype'是一個簡單的數組,但注意相當偷偷摸摸的'+ 1'! – usr2564301

+0

「ctype函數專門用於處理EOF以啓用這樣的代碼。」 - 這是寫在標準?這只是你的意見。事情比這更合理。 –

+0

@IgorLiferenko標準很少提到其決策的理由,你需要去其他地方找到它們。民間智慧是一個來源。 –

相關問題