C中的EOF问题

4 c string newline eof getchar

我正在编写一个程序,它应该读取两个可以包含换行符和其他各种字符的字符串.因此,我使用EOF(Ctrl-Z或Ctrl-D)结束字符串.

这适用于第一个变量,但是使用第二个变量,然而,这似乎是有问题的,因为显然某些东西卡在输入缓冲区中并且用户无法输入任何内容.

我尝试用while (getchar() != '\n');几种类似的变化来清理缓冲区,但似乎没有任何帮助.所有清洁尝试都导致无限循环,如果不进行清洁,则无法添加第二个变量.

两个变量的字符都在这样的循环中读取:while((c = getchar()) != EOF)这表明它是我在缓冲区中停留的EOF.或者以其他方式影响程序的行为?我正在使用的逻辑有什么问题吗?

经过几个小时的挣扎,我开始有点绝望了.

[编辑:下面添加代码]

[编辑2:clearerr()似乎使这个EOF解决方案毕竟有效.

它似乎以我在Linux下的原始形式运行,我昨天在Windows上试用它.

码:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int x = 0;
    int c;
    char a[100];
    char b[100];

    printf("Enter a: ");
    while((c = getchar()) != EOF)
    {
        a[x] = c;
        x++;
    }
    a[x] = '\0';
    x = 0;

    /*while (getchar() != '\n'); - the non-working loop*/

    printf("\nEnter b: ");
    while((c = getchar()) != EOF)
    {
        b[x] = c;
        x++;
    }
    b[x] = '\0';

    printf("\n\nResults:\na: %s\n", a);
    printf("b: %s\n", b);

    return(0);
}
Run Code Online (Sandbox Code Playgroud)

[编辑3:]

动态内存问题:

我的程序也应该处理超过100个字符的字符串.最初我打算通过动态内存分配来解决这个问题,但是当我遇到上述无限循环和内存相关崩溃的问题时,我把它留下来并切换到char [100].

我想我尝试过的通常是这样的:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int x = 0;
    int c;
    char a[100];
    char b[100];

    printf("Enter a: ");
    while((c = getchar()) != EOF)
    {
        a[x] = c;
        x++;
    }
    a[x] = '\0';
    x = 0;

    /*while (getchar() != '\n'); - the non-working loop*/

    printf("\nEnter b: ");
    while((c = getchar()) != EOF)
    {
        b[x] = c;
        x++;
    }
    b[x] = '\0';

    printf("\n\nResults:\na: %s\n", a);
    printf("b: %s\n", b);

    return(0);
}
Run Code Online (Sandbox Code Playgroud)

这是一种可行的(或明智的)方法吗?我正在尝试为那里处理的每个角色分配更多内存.独立.使用这样的代码(这个例子可能包含语法错误)我经历过崩溃,所以在我看来malloc可能不是正确的功能,或者我试错了.假设它甚至可能.

Mar*_*wis 11

从终端收到EOF后,您将不会收到任何其他数据.没有办法取消输入 - 文件的结尾就是结束.

因此,您应该定义每个变量在单独的行上输入,并让用户按Enter键而不是EOF.你还需要检查是否已收到EOF,因为这意味着用户实际EOF类型的,你不会看到任何东西 - 在这种情况下,你需要跳出循环和打印错误消息.