C - EOF中的EndOfFile

时间:2009-09-17 07:29:11

标签: c

你用什么来结束程序,-1,不起作用:

#include <stdio.h>
//copy input to output
main() {
    char c;
    c = getchar();
    while(c != EOF) {
        putchar(c);
        c = getchar();
    }
}

9 个答案:

答案 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的任何东西