簡體   English   中英

C編程:EOF作為一個角色

[英]C Programming: EOF as a character

當為命令控制台編程C時,當你有一個試圖使用SCANF向用戶輸入CHAR變量的函數,並且用戶輸入CTRL + Z (EOF)並命中輸入時會發生什么?

例如:

char promptChar()
{
    char c;
    printf("Enter a character: ");
    scanf("%c", &c);
    return c;
}

如果用戶鍵入CTRL + Z並按下Enter鍵,那么promptChar()會返回什么? 因為如果我理解EOF,它就是一個int。

首先要做的事情:

SCANF不是由語言定義的。
CHAR不是由語言定義的。

好的,開始了......

scanf()函數返回一個整數。 如果在第一次轉換之前發生輸入故障,則該整數是指定的輸入項數或宏EOF的值。
你沒有檢查scanf()調用的返回值,所以你不知道發生了什么。 一切都可能正常,或者輸入流可能在第一次轉換之前結束,或者(不是%c)可能存在轉換失敗。

測試scanf()的返回值。 實際上, 總是測試所有<stdio.h>函數的返回值

char ch;
int result = scanf("%c", &ch);
if (result == 1) /* all ok */;
else if (result == 0) /* conversion failure: value of `ch` is indeterminate */;
else if (result == EOF) /* input failure; value of `ch` is indeterminate */;

scanf()調用的結果是EOF ,如果您想了解有關輸入失敗原因的更多信息,可以使用feof()和/或ferror()

else if (result == EOF) {
    if (feof(stdin)) {
        /* no data in input stream */
    }
    if (ferror(stdin)) {
        /* error if input stream (media ejected? bad sector? ...?)
    }
}

回答你的問題: what will promptChar() return?

它將返回char類型的不確定值。
您可以按照處理字符的庫函數示例並從promptChar()返回一個int。 這將是對unsigned char進行字符讀取的值或出現錯誤時為負int( EOF )的值。 例如,閱讀fgetc()的描述。

從Linux scanf(3)頁:

“如果在第一次成功轉換或匹配失敗發生之前達到輸入結束,則返回值EOF 。如果發生讀取錯誤,也會返回EOF ,在這種情況下,流的錯誤指示符(參見ferror(3) )已設置,並且設置了errno表示錯誤。“

請注意,此段落涉及scanf的返回值,而不是結果參數。

這取決於您正在使用的命令shell,但您實際上不應該設計任何期望從交互式提示中讀取控制字符的程序。

大多數命令shell將攔截一些控制字符並使用它們來告訴shell執行操作。 例如ctrl-s和ctrl-q經常啟動和停止shell的輸出字符顯示。 某些shell上的ctrl-z實際上將被視為關閉shell的命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM