[英]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.