我正在编写一个小程序,用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()的其他调用不等待键盘输入。
经过一些调试后,我发现该错误是getchar();。由于某种原因读入'\ n'字符而不是等待输入,while循环测试失败,该函数实质上返回一个空字符串。
我做了一些研究,并不断寻找使用
while(getchar() != '\n');
为了正确刷新标准输入,在函数末尾会产生不希望的结果,因为在键入ENTER之后,程序将再次提示您进行更多输入。再次按ENTER键继续执行程序,但是其他所有后续调用仍会立即以该神秘的'\ n'字符读取,从而导致测试失败,并在每次打印菜单项的内容时产生空字符串。结构。
谁能告诉我这是怎么回事?为什么即使我清除了输入缓冲区,getchar()仍继续获取“ \ n”?我试过只是放置一个getchar();函数的开头和结尾处的语句,尝试执行“ do while”循环,并对其进行了其他戳戳,但我似乎无法弄清楚。
最佳答案
您编写的代码有几个缺点。我将尝试解释它们,因为尚不清楚您的代码在哪里失败(可能在您发布的功能之外)
首先,您无需在EOF
结果值中检查getchar()
。 getchar(3)
不能精确地返回char
以允许返回所有可能的char
值以及一个额外的EOF
来标记文件的结尾(可以通过输入在Unix中,或在Windows计算机上为Ctrl-D
)在这种情况下,必须在代码中明确考虑这种情况,因为您会将结果转换为Ctrl-Z
,并且会丢失从函数中收到的额外信息。阅读char
手册页以解决此问题。
其次,您不检查输入的字符是否足以填充所有数组并溢出它。对于该函数,您仅传递一个指向数组开头的指针,但没有任何指示符可指示数组的扩展范围,因此您可能会超出其边界的末尾,只是覆盖了未被保留用于输入目的的内存。通常,这会导致出现所谓的U.B。在文学中(未定义的行为),这是您必须注意的事情。这可以通过传递有效位置的计数器来填充数组,并为每个填充的有效位置递减它来解决。并且一旦缓冲区已满,就不允许更多的输入。
另一方面,您有一个标准功能可以做到这一点,getchar(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 */
关于c - getchar()继续读取“\n”。到底是怎么回事?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33030157/