C语言中的文件结尾(EOF)
我目前正在读里奇和克尼汉的书《C编程语言》。我对EOF在C语言中的文件结尾(EOF),c,eof,C,Eof,我目前正在读里奇和克尼汉的书《C编程语言》。我对EOF在getchar()函数中的用法感到非常困惑 首先,我想知道为什么EOF的值是-1,为什么getchar()的值是-1=EOF为0。请原谅我的问题,但我真的不明白。我真的试过了,但是不行 然后我试着在书上运行这个例子,它可以使用下面的代码计算字符数,但似乎即使我按enter键,我也永远不会跳出循环,所以我想知道什么时候才能到达EOF main(){ long nc; nc = 0; while (getchar() != E
getchar()
函数中的用法感到非常困惑
首先,我想知道为什么EOF的值是-1,为什么getchar()的值是-1=EOF
为0。请原谅我的问题,但我真的不明白。我真的试过了,但是不行
然后我试着在书上运行这个例子,它可以使用下面的代码计算字符数,但似乎即使我按enter键,我也永远不会跳出循环,所以我想知道什么时候才能到达EOF
main(){
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
然后,我在上读到了同样的问题。大多数人建议不要使用EOF,而是使用终止符\n或空终止符“\0”,这很有意义
这是否意味着书中的例子还有另一个用途 这是很多问题
EOF
是-1:在POSIX系统调用中,通常会在出错时返回-1,所以我猜这个想法是“EOF是一种错误”getchar()!=EOF
为FALSE时为0
,表示getchar()
返回EOF
stdin
读取时模拟EOF
,请按Ctrl+Dgetchar
的任何返回值。因此,getchar
以无符号字符的形式返回任何字符值,并将其转换为int,因此int将是非负的
如果您在终端上键入,并且希望引发文件结束,请使用CTRL-D(unix样式系统)或CTRL-Z(Windows)。然后在读取所有输入后,getchar()
将返回EOF
,因此getchar()!=EOF
将为false,循环将终止
[*]如果由于整数溢出,输入超过了LONG_MAX个字符,那么它有未定义的行为,但在一个简单的例子中,我们可能可以原谅这一点。EOF是-1,因为它是这样定义的。该名称由您包含的标准库标题提供。它们使它等于-1,因为它必须是不能被误认为是
getchar()
读取的实际字节getchar()
使用正数(0到255,包括0到255)报告实际字节的值,因此-1适用于此
=代码>运算符表示“不相等”。0代表false,其他任何东西都代表true。因此,我们调用getchar()
函数,并将结果与-1(EOF)进行比较。如果结果不等于EOF,那么结果就是真的,因为不相等的东西是不相等的。如果结果等于EOF,则结果为假,因为相等的事物不(不相等)
调用getchar()
在到达“文件末尾”时返回EOF。就C而言,“标准输入”(通过在命令窗口中键入而提供给程序的数据)就像一个文件。当然,你总是可以输入更多,所以你需要一个明确的方式说“我完成了”。在Windows系统上,这是control-Z。在Unix系统上,这是control-D
书中的例子并不“错”。这取决于你真正想做什么。阅读直到EOF意味着你阅读所有内容,直到用户说“我完成了”,然后你就不能再阅读了。读取到“\n”表示您读取了一行输入。如果您希望用户键入输入,那么一直读到“\0”是个坏主意,因为在命令提示符下用键盘很难或不可能生成此字节:)您确实知道您提到的书是由C语言的原始作者编写的,对吗?布尔运算返回非零表示真,返回零表示假。这是有区别的。不,运算符被定义为返回1。在布尔上下文(例如,if()
或while()
条件)中,任何非零值都是“true”。我现在知道了问题所在。。这就是为什么我看不到结果。。这是因为我使用的是Dev-C++并且它没有系统(“暂停”),所以我需要在代码的末尾键入它。它只是终止您的终端,而内核又知道无法读取更多字节,因此标准输入文件描述符中没有可用数据。@newbiesystem
函数创建一个新shell并运行传递给它的命令。该命令由系统外壳程序执行,与编译器whatsoeverIf无关。如果您按回车键“enter”,“getchar()”,则只需查看一个字符和“nc”变量即可。