繁体   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