在C中的EOF之后执行

在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; }

我正在为我的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)?

首先
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);