首页 > 解决方案 > 如何正确使用EOF?

问题描述

我对 EOF 有疑​​问。

首先,我正在编写一个简单的程序来处理/打印用户的输入。

但是,程序也会在输出中复制 EOF。

例如,我的操作系统是 Window,当我按顺序键入 (Enter -> cntrl + z -> Enter) 时,我的 EOF 工作。如果我输入“Hello” + Enter + EOF 组合键,输出会在复制的用户输入的末尾打印出奇怪的字母('?')。

在此处输入图像描述

我怎样才能摆脱'?在输出的末尾,为什么会这样?

#include <stdio.h>

void copy(char to[], char from[]);

main()
{
    int i;
    int c;

    char origin[10];
    char copied[10];

    for(i = 0; (c = getchar()) != EOF; ++i)
    {
        origin[i] = c;
    }

    copy(copied, origin);


    for(i = 0; i < 10; i++)
        putchar(copied[i]); 



}

void copy(char to[], char from[])
{
    int i;

    i = 0;
    while((to[i] = from[i]) != '\0')
        i++;
}

标签: cioeof

解决方案


你忘了 NUL-terminate origin。因此,您在复制期间调用未定义行为。请改用以下代码获取输入:

for(i = 0; i < 9 && (c = getchar()) != EOF; ++i) /* `i < 9` to prevent array overruns */
{
    origin[i] = c;
}
origin[i] = '\0'; /* NUL-terminate your string */

还将打印代码更改为:

for(i = 0; copied[i] != '\0'; i++) /* Print until a NUL-terminator */
    putchar(copied[i]); 

推荐阅读