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