C - EOF中的EndOfFile

问题描述 投票:0回答:9

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

#include <stdio.h>
//copy input to output
main() {
    char c;
    c = getchar();
    while(c != EOF) {
        putchar(c);
        c = getchar();
    }
}
c
9个回答
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;
}

10
投票

宏:int EOF

此宏是一个整数值,由许多函数返回以指示文件结束条件或某些其他错误情况。使用GNU库,EOF为-1。在其他库中,其值可能是其他一些负数。


5
投票

getchar的文档是它返回下一个可用的字符,强制转换为unsigned char然后以int返回值返回。

这样做的原因是为了确保所有有效字符都返回为正值,并且不会与EOF(一个评估为负整数值的宏)相等。

如果你将getchar的返回值放入char,那么根据你的实现的char是签名还是未签名,你可能会得到EOF的虚假检测,或者即使你应该也可能永远不会检测到EOF

当从文件或管道进程重定向程序的输入时,通常会自动将EOF发送到C库。交互式地取决于您的终端和shell,但通常在unix上使用Ctrl-D和单独的Windows Ctrl-Z实现。


3
投票

你应该使用int而不是char


0
投票

如果getchar()返回的整数值存储到char类型的变量中,然后与整数常量EOF进行比较,则比较可能永远不会成功,因为扩展为整数时char类型的变量的符号扩展是实现定义的。 - opengroup POSIX standard


0
投票

如果您的编译器默认为char是unsigned(或者通过用于调用编译器的任何选项),则可能是

(c == EOF)

永远不可能是真的。如果sizeof(unsigned char) < sizeof( int)几乎总是如此,那么将char推广到int将永远不会产生负值,而EOF必须是负值。

这就是为什么C标准中处理或返回字符的所有(或至少很多,如果不是全部)函数指定int作为参数或返回类型的原因之一。


0
投票

EOF不是一个真实的角色或一系列角色。 EOF表示输入文件或流的结束,即getchar()尝试读取最后一个字符之外的情况。

在Unix上,您可以通过键入CTRL-D来关闭交互式输入流。这种情况导致getchar()返回EOF。但是如果文件包含ASCII码为4的字符(即CTRL-D),则getchar()将返回4,而不是EOF


0
投票

它仍然适用于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
投票

嗨,我认为它在流-1中的becoz不是一个而是两个字符,并且它们的ascii都不是-1或者用于EOF的任何东西

© www.soinside.com 2019 - 2024. All rights reserved.