来自C编程语言:
int c;
while ((c = getchar()) != EOF)
putchar(c);
Run Code Online (Sandbox Code Playgroud)
"......解决方案是getchar在没有更多输入时返回一个独特的值,一个不能与任何真实字符混淆的值.这个值被称为EOF"文件结束".我们必须声明c是一个类型大足以容纳任何getchar返回的价值.我们不能使用,char因为除了任何可能之外c必须足够大."EOFchar
我签到stdio.h并在我的系统上打印了EOF的值,然后设置为-1.在我的系统上,chars已签名,但我知道这是依赖于系统的.所以,EOF可以适合char我的系统.我通过定义c为a 重写了上面的小例程,char程序按预期工作.还有ASCII字符表中的字符这里,似乎有对应于看起来像行事255空白字符EOF.
那么,为什么看起来ASCII有一个为EOF指定的字符(255)?这似乎与The C Programming Language一书中的内容相矛盾.
当getchar()读取字节255时,它返回255.当getchar()发现没有更多输入时,它返回-1.
如果将结果存储在a中char,则无法区分这两者.但是当你把它们存放在一个时int,你就可以.(此声明独立于签名char).
只有当您知道结果有效时才能将其转换为char并获得通常的C风格字符类型.
小智 4
那么,为什么 ASCII 有一个指定为 EOF 的字符(255)呢?
还没有。更准确地说,这不是 EOF“字符”。
技巧是,getchar()如果有东西要读,总是返回非负值。如果遇到文件结尾,它只会返回-1(这似乎是在您的实现中定义的)。EOF
事实char是:
只是您的实现的一个怪癖(尽管现在非常普遍)。因此,如果您使用 achar来存储 的返回值getchar(),则读取输入可能会提前终止:代码为 255 的字符将被误认为 -1 又名EOF,这是一个错误。这正是发生在你身上的事情。它不起作用——相反,你的第二种方法完全被破坏了。