簡體   English   中英

在C中的EOF之后執行

[英]execute after EOF in C

我正在為C編程課做作業。 問題指出“編寫一個程序,該程序以字符流的形式讀取輸入,直到遇到EOF為止”。 我在Macbook上使用Xcode,我知道使程序遇到EOF的唯一方法是使用ctrl + D或ctrl +Z。但是它將完全退出我的程序。

例如,我有以下代碼:

int main()
{
    int ch;
    while ((ch = getchar()) != EOF)
    {
        putchar(ch);

    }
    printf("%d",ch);
    return 0;
}

循環后(在我按下鍵盤上的Ctrl + D之后),是否有代碼可以執行printf(“%d”,ch)?

您可以使用(在POSIX shell中) 此處文檔測試程序。

首先使用以下命令將源代碼mycode.c編譯為二進制mybin

 gcc -std=c99 -Wall -Wextra -g mycode.c -o mybin

(它可以是clangcc而不是gcc

然后用“ here document”運行mybin

 ./mybin << EOF
    here is my 
    input
 EOF

您也可以使用輸入重定向。 創建一些文件myfile.txt並運行./mybin < myfile.txt

您甚至可以在自己的源代碼上運行程序: ./mybin < mycode.c

輸入甚至可以來自某些管道,例如ls * | ./mybin ls * | ./mybin

順便說一句,您正在觀察的是stdin (當它是終端時)是行緩沖的。 查看此答案 (大多數答案應適用於MacOSX)。

請注意,您的代碼是不正確的:您在文件頂部附近缺少#include <stdio.h> ,並且您的main實際上應該是int main(int argc, char**argv) (順便說一句,您可以改進程序,以便給出參數時,它們就是要讀取的文件名)。 最后, printf末尾肯定會顯示-1,這通常是EOF的值

另外,最好以\\n結尾您的printf格式控制字符串,或者使用適當的fflush(3)

請注意,文件結尾不是輸入(或有效char ),它是某些輸入文件流(例如stdin )的條件,並且指定了getchar(3)函數以返回EOF ,該EOF是范圍之外的int char (在我的Linux系統上, EOF為-1,因為char -s在0到255之間)。 您可以使用feof(3) 在進行一些輸入操作( 從未有過!) 之后測試文件結束條件

處於正常烹飪模式的終端由內核處理,因此當您按Ctrl D時,在與該終端相關的文件描述符(通常為STDIN_FILENO即0)上觸發文件結束條件

我在Macbook上使用Xcode,我知道使程序遇到EOF的唯一方法是使用ctrl + D或ctrl +Z。但是它將完全退出我的程序。

不,不會。 如果您在Xcode調試器中運行程序,只要控制台窗格具有焦點,您鍵入的所有輸入都將進入您的程序(請注意,默認情況下,stdin是行緩沖的,因此,只有在按返回鍵)。 如果您按Control-d(而不是Control-z),則程序將退出循環並在控制台窗口中顯示-1(這是您期望的,因為這是OS X中EOF的值)。

這是我在Xcode調試器中運行但未更改的程序的結果(我在Xcode中鍵入command-r)

bgbgdfsfd
bgbgdfsfd
hgfdgf
hgfdgf
-1

我輸入的是常規字體,粗體來自您的程序。 在我鍵入的每一行的末尾,我按回車鍵。 在您的程序打印hgfdgf我鍵入了control-D。 然后,您的程序打印了從getchar()獲得的最后一個值,該值在OS XC庫中為EOF ,即為-1


編輯

如果不確定您的程序正在打印EOF,請將您的printf格式字符串更改為(例如)

printf("Last character is [%d]\n", ch);

然后,程序將在最后一行輸出Last character is [-1] ,而不是-1

首先ctrl+z不會在程序中輸入EOF。 如果您按ctrl+Z shell將使程序進入睡眠狀態。

其次,如果要在程序中處理這些ctrl+Z ,則需要學習C語言中的信號處理。

而且我認為,因為您按的是ctrl+Z您在屏幕上看不到任何輸出。

確保發送的是EOF信號,而不是實際終止程序的信號。

例如,對於在Windows中運行的c程序,通過鍵入ctrl + z並按Enter表示EOF。 這樣做將退出while循環,但仍將運行其余程序。

但是,某些人可能為EOF嘗試了錯誤的ctrl + c,實際上殺死了您的程序,並阻止了while循環后面的代碼執行。

對於Mac,您將需要查找對應於EOF的輸入,並確保這是您通過發送的內容,而不是kill信號,我懷疑這是您在此處執行的操作。

暫無
暫無

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

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