getchar()一直在读取“\n”。发生了什么事?

getchar()一直在读取“\n”。发生了什么事?,c,arrays,stdin,prompt,getchar,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()) !=

我正在写一个小程序来练习用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”循环,并对其进行了其他尝试,但我似乎无法理解这一点

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

首先,在getchar结果值中不检查EOF。getchar3不会精确地返回一个字符,以允许返回所有可能的字符值加上一个额外的字符值EOF,以标记文件的结尾。这可以通过在unix中输入Ctrl-D或在windows计算机上输入Ctrl-Z从终端生成。这种情况必须在代码中显式设置上下文,因为您将结果转换为字符,并且将丢失从函数中收到的额外信息。请阅读getchar3手册页以解决此问题。 其次,您没有检查是否输入了足够的字符来填充所有数组并使其溢出。只向函数传递一个指向数组开头的指针,但没有任何内容指示数组的扩展程度,因此可能会超出其边界的末尾,只会覆盖未保留用于输入目的的内存。这通常会导致文献中称为U.B.的未定义行为,这是您必须注意的。这可以通过传递一个有效位置的计数器来填充数组并对每个填充的有效位置递减来解决。一旦缓冲区填满,就不允许更多的输入。 另一方面,您有一个standar函数,它正好可以实现这一点,fgets3只需从输入文件中读取一个字符串数组,并将其存储在指针上,以及传递给它的大小:

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 */

您也应该始终检查EOF:while c=getchar!=EOF&c!='\或者你可以先测试换行符,再测试EOF。这是否真的是您的问题的根源,充其量是有争议的。您还使用哪些其他函数读取输入?请发布一个完整的程序来说明你的问题。我已经尝试了上面的代码行,它仍然会产生同样的不良结果,尽管我最终计划相应地设计程序。婴儿步!等一下。。。随机数832。。。我想你刚刚解决了我的问题。。。在调用getInput之后,我有一个scanf函数!我马上查!对感谢@Random832提出正确的问题!我把一个getchar while循环放在我拥有的scanf函数之后,它工作了!虫子压扁了!