[英]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
(它可以是clang
或cc
而不是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.