在C中的EOF之后执行
我正在为我的C编程课做作业。问题是“编写一个程序,将输入作为字符流读取,直到遇到EOF”。我在macbook上使用Xcode,我知道让程序遇到EOF的唯一方法是使用ctrl+D或ctrl+Z。但它会完全退出我的程序 例如,我有以下代码:在C中的EOF之后执行,c,input,eof,C,Input,Eof,我正在为我的C编程课做作业。问题是“编写一个程序,将输入作为字符流读取,直到遇到EOF”。我在macbook上使用Xcode,我知道让程序遇到EOF的唯一方法是使用ctrl+D或ctrl+Z。但它会完全退出我的程序 例如,我有以下代码: int main() { int ch; while ((ch = getchar()) != EOF) { putchar(ch); } printf("%d",ch); return 0; }
int main()
{
int ch;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
printf("%d",ch);
return 0;
}
在循环之后(我在键盘上按ctrl+d后),代码是否可以执行printf(“%d”,ch)?首先
ctrl+z
不会将EOF输入到程序中。如果您点击ctrl+Z
,shell将使程序进入睡眠状态
其次,如果您想在程序中处理这些ctrl+Z
,您需要学习C语言中的信号处理
我认为,因为您正在点击
ctrl+Z
,所以在屏幕上看不到任何输出。首先ctrl+Z
不会将EOF输入到您的程序中。如果您点击ctrl+Z
,shell将使程序进入睡眠状态
其次,如果您想在程序中处理这些ctrl+Z
,您需要学习C语言中的信号处理
而且我认为,因为您点击了
ctrl+Z
,所以在屏幕上看不到任何输出。您可以使用(使用POSIX外壳)测试您的程序
首先将源代码mycode.c
编译成二进制文件mybin
gcc -std=c99 -Wall -Wextra -g mycode.c -o mybin
(可以是clang
或cc
而不是gcc
)
然后使用“heredocument”运行mybin
,如
/mybin您可以使用(使用POSIX外壳)测试您的程序
首先将源代码mycode.c
编译成二进制文件mybin
gcc -std=c99 -Wall -Wextra -g mycode.c -o mybin
(可以是clang
或cc
而不是gcc
)
然后使用“heredocument”运行mybin
,如
/mybin
我在macbook上使用Xcode,我知道让程序遇到EOF的唯一方法是使用ctrl+D或ctrl+Z。但它会完全退出我的程序
不会的。如果您在Xcode调试器中运行程序,只要控制台窗格有焦点,您键入的所有输入都将转到您的程序(请注意,默认情况下,stdin是行缓冲的,因此只有在按下返回键时才能看到输出)。如果您点击control-d(而不是control-z),您的程序将退出循环并在控制台窗口中打印-1(这是您所期望的,因为这是OSX中的EOF值)
这是我在Xcode调试器中运行您的程序时没有更改的结果(我在Xcode中键入了command-r)
bgfsfd
bgbgfsfd
hgfdgf
hgfdgf
-1
常规字体是我输入的,粗体字体来自你的程序。在我键入的每一行末尾,我按回车键。在您的程序打印hgfdgf
后,我键入control-D。然后,您的程序打印它从OS X C库中的getchar()
得到的最后一个值,它是EOF
,它是-1
编辑
如果不确定程序是否正在打印EOF,请将printf
格式字符串更改为(例如)
然后,程序将输出最后一行的最后一个字符[-1]
,而不是-1
我在macbook上使用Xcode,我知道让程序遇到EOF的唯一方法是使用ctrl+D或ctrl+Z。但它会完全退出我的程序
不会的。如果您在Xcode调试器中运行程序,只要控制台窗格有焦点,您键入的所有输入都将转到您的程序(请注意,默认情况下,stdin是行缓冲的,因此只有在按下返回键时才能看到输出)。如果您点击control-d(而不是control-z),您的程序将退出循环并在控制台窗口中打印-1(这是您所期望的,因为这是OSX中的EOF值)
这是我在Xcode调试器中运行您的程序时没有更改的结果(我在Xcode中键入了command-r)
bgfsfd
bgbgfsfd
hgfdgf
hgfdgf
-1
常规字体是我输入的,粗体字体来自你的程序。在我键入的每一行末尾,我按回车键。在您的程序打印hgfdgf
后,我键入control-D。然后,您的程序打印它从OS X C库中的getchar()
得到的最后一个值,它是EOF
,它是-1
编辑
如果不确定程序是否正在打印EOF,请将printf
格式字符串更改为(例如)
然后,您的程序将输出最后一行的最后一个字符是[-1]
,而不是-1
。确保您发送的是EOF信号,而不是实际终止程序的信号
例如,对于在windows中运行的c程序,EOF通过键入ctrl+z并按enter键来表示。这样做将退出while循环,但仍会运行程序的其余部分
但是,ctrl+c(有些人可能错误地尝试了EOF)实际上会终止程序,并阻止while循环后面的代码执行
对于mac,您需要找到与EOF对应的输入,并确保这是您发送的信号,而不是kill信号,我怀疑这就是您在这里所做的 确保发送的是EOF信号,而不是实际终止程序的信号 例如,对于在windows中运行的c程序,EOF通过键入ctrl+z并按enter键来表示。这样做将退出while循环,但仍会运行程序的其余部分 然而,ctr
printf("Last character is [%d]\n", ch);