你用什么来结束程序,-1,不起作用:
#include <stdio.h>
//copy input to output
main() {
char c;
c = getchar();
while(c != EOF) {
putchar(c);
c = getchar();
}
}
答案 0 :(得分:10)
宏:int EOF
此宏是 整数值 ,由许多函数返回,表示文件结束条件或其他一些错误情况。 使用GNU库,EOF为-1 。在其他库中,其值可能是其他一些负数。
答案 1 :(得分:5)
getchar
的文档是返回下一个可用字符,转换为unsigned char
,然后以int
返回值返回。
这样做的原因是为了确保所有有效字符都返回为正值,并且不会比较等于EOF
,这是一个评估为负整数值的宏。
如果您将getchar
的返回值放入char
,那么根据您的实施char
是已签名还是未签名,您可能会对EOF
进行虚假检测,或者你甚至可能永远不会发现EOF
。
当从文件或管道进程重定向程序输入时,通常会自动向C库发送EOF
信号。要以交互方式进行,取决于您的终端和shell,但通常在unix上使用Ctrl-D和单独的Windows Ctrl-Z实现。
答案 2 :(得分:3)
您应该使用int
而不是char
答案 3 :(得分:2)
我同意这个帖子中的所有其他人说使用 int c 而不是 char 。
要结束循环(至少在* nix系统上),您可以按 Ctrl-D 发送 EOF 。
此外,如果您希望立即回复您的角色,请重写您的代码:
#include<stdio.h>
int
main(void)
{
int c;
c = getchar();
while (c != EOF)
{
putchar(c);
c = getchar();
fflush(stdout); /* optional, instant feedback */
}
return 0;
}
答案 4 :(得分:0)
如果getchar()返回的整数值存储在char类型的变量中,然后与整数常量EOF进行比较,则比较可能永远不会成功,因为扩展为整数时char类型的变量的符号扩展是实现定义。 - opengroup POSIX standard
答案 5 :(得分:0)
如果您的编译器默认为unsigned
(或者通过用于调用编译器的任何选项),则可能是
(c == EOF)
永远不会是真的。如果sizeof(unsigned char) < sizeof( int)
几乎总是如此,那么将char
提升为int将永远不会产生负值,而EOF
必须是负值。
这就是为什么C标准中处理或返回字符的所有(或至少很多,如果不是全部)函数指定int
作为参数或返回类型的原因之一。
答案 6 :(得分:0)
EOF
不是实际字符或字符序列。 EOF
表示输入文件或流的结束,即getchar()
尝试读取最后一个字符之外的字符的情况。
在Unix上,您可以通过键入 CTRL - D 来关闭交互式输入流。这种情况会导致getchar()
返回EOF
。但是如果文件包含ASCII码为4的字符(即 CTRL - D ),getchar()
将返回4,而不是EOF
。
答案 7 :(得分:0)
它仍适用于 char 数据类型。但是这些技巧是用 int 值检查循环中的条件。
首先: 让我们检查一下。如果您编写以下代码,如
printf("%d",getchar());
然后,如果您从键盘输入 A ,您应该会看到 65 值 A < / strong>或者如果您提供 CTRL - D ,请参阅 -1 。
因此,如果您实施此逻辑,那么解决代码就是
#include<stdio.h>
int main()
{
char c;
while ((c = getchar()) != EOF){
putchar(c);
//printf("%c",c); // this is another way for output
}
return 0;
}
答案 8 :(得分:-1)
嗨我认为它在流-1中的becoz不是一个而是两个字符,而且它们的ascii都不是-1或者用于EOF的任何东西