getchar()继续读'\ n'。到底是怎么回事?

时间:2015-10-09 04:53:42

标签: c arrays stdin prompt getchar

我正在编写一个小程序来编写C语言编程。

我希望它使用getchar();用于从用户获取输入的功能。 我使用以下函数提示用户输入,然后使用getchar()循环将输入存储在数组中:

该函数传递一个引用结构成员的指针。

getInput(p->firstName); //The function is passed an argument like this one




void getInput(char * array)
{
    int c;

    while((c=getchar()) != '\n')
        *array++ = c;
    *array = '\0'; //Null terminate
}

此函数被多次调用,因为它是创建结构的函数的一部分,并填充它的数组成员。

但是当程序执行时,对它的前两次调用工作正常,但是对该函数的任何后续调用都将导致对getchar()的每次调用都不等待键盘输入。

经过一些调试后,我将bug描述为getchar();由于某种原因读取'\ n'字符而不是等待输入,while循环测试失败,并且该函数基本上返回一个空字符串。

我做了一些研究并继续寻找使用

while(getchar() != '\n');

在函数结束时为了正确刷新stdin,但是,这会产生不良结果,因为在我输入ENTER后程序会再次提示输入更多内容。再次按下ENTER继续该程序,但是其他所有后续调用都会继续读取这个神秘的'\ n'字符,导致测试失败,并在每次打印内容时导致空字符串。结构。

有人能向我解释这里发生了什么吗?为什么getchar()继续提取'\ n',即使我认为清除了输入缓冲区?我试过放一个getchar();在函数的开头和结尾处的语句,尝试'do while'循环,并采取其他刺戳,但我似乎无法弄清楚这一点。

1 个答案:

答案 0 :(得分:0)

您编写的代码有几个缺点。我会尝试解释它们,因为不清楚你的代码在哪里失败(可能在你发布的函数之外)

  • 首先,您不会在EOF结果值中检查getchar()getchar(3)不会准确地返回char以允许返回可能的char值加上额外的EOF来标记文件的结尾(这可以生成来自终端,在unix中输入Ctrl-D,或在Windows机器上输入Ctrl-Z这种情况必须在您的代码中明确表示,因为您将结果转换为char并且丢失您从该功能收到的额外信息。阅读getchar(3)手册页以解决此问题。
  • 其次,您不检查是否输入了足够的字符来填充所有数组并将其溢出。对于函数,您只传递一个指向数组开头的指针,但没有任何东西表示它扩展了多远,因此您可能会超出其边界的末尾,只是覆盖未为输入目的而保留的内存。这通常导致称为U.B.在文献中( U ndefined B 行为),这是你必须关心的事情。这可以通过传递有效位置的计数器来填充数组并针对每个有效位置递减来解决。缓冲区填满后不允许更多输入。

另一方面,你有一个标准功能就是这样,fgets(3)只是从输入文件读取一个字符串数组,并将它存储在你传递给它的指针(和大小)上:

char *fgets(char *buffer, size_t buffer_size, FILE *file_descriptor);

您可以像以下一样使用它:

char buffer[80], *line;
...
while (line = fgets(buffer, sizeof buffer, stdin)) {
    /* process one full line of input, with the final \n included */
    ....
}

/* on EOF, fgets(3) returns NULL, so we shall be here after reading the
 * full input file */