gpt4 book ai didi

c - 伴随其他值时的 EOF 行为

转载 作者:太空宇宙 更新时间:2023-11-04 01:34:26 25 4
gpt4 key购买 nike

*注意:我使用的是 Windows,所以 EOF 对我来说是 ctrl + Z。

一段时间以来,我注意到 EOF 输入在孤立状态下的表现似乎与伴随其他输入时的表现不同。例如,^Z(Windows 命令提示符中的 EOF 命令)和 a^Z 似乎会导致以下代码出现不同的行为:

#include <stdio.h>

#define MAX 1000

int getline(char s[]);

main() {

int line;
char arr[MAX];

while( (line = getline(arr)) != EOF)
printf("%s",arr);

system("Pause");
return 0;
}

int getline(char s[])
{
int c, i = 0;

while ((c = getchar()) != EOF && c != '\n') {
s[i++] = c;
}
if (c == '\n') {
s[i++] = c;
}
else
return EOF;
s[i] = '\0';
return 1;
}

如果我在命令提示符中输入 ^Z + enter,程序会跳转到 system("Pause"); 但是,如果我输入 abc ^Z + enter,没有任何反应,就像忽略了 EOF 并且从未收到过 '\n' 命令一样。如果此时我再次按回车键,它会显示以下内容:

EOF weirdness

一个多小时以来,我一直在修补和调试这段代码及其小的变体,似乎找不到任何问题。理论上,如果我输入 abc^Z + enter,我希望输入被解释为 abcEOF\n,这将给出:

s[0] = 'a'
s[1] = 'b'
s[2] = 'c'
i = 3 when loop breaks from c = EOF
if (c == '\n') skipped since c = EOF
leads to else -> return EOF
in main(), line = EOF since that is what the function getline returned
while loop breaks because of above
system("Pause"); follows

我的代码是否有我忽略的问题,或者 EOF 或命令提示符是否有一些我应该注意的怪癖?我几乎可以肯定这不是将 ^Z 与其他值混合导致意外行为的唯一实例。

最佳答案

不要将 CTRL-Z 视为文件结束字符,实际上有一个真实字符和代码点26(这是您通常期望 CTRL-Z 生成的)。

相反,请将 CTRL-Z 视为您的终端设备 指示程序输入流结束的一种方式。如果您要读取磁盘的真实文件并且它包含CTRL-Z,它应该继续读取(尽管在您的某些实现中可能不是这种情况,例如,使用 r 而不是 rb 模式打开它。

在 Windows 中,CTRL-Z 到结束流操作的转换仅在它出现在该行的开始 时发生,这就是为什么你不输入 abc<kbd>CTRL-Z</kbd> 时得到 EOF .

当您在不是行首的字符位置输入 CTRL-Z 时,它会被视为真正的 CTRL-Z,不是流关闭操作。这就是为什么你得到 字符,这是代码点 26 处的可打印字符。

关于c - 伴随其他值时的 EOF 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17162167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com