我正在编写一个小程序来编写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'循环,并采取其他刺戳,但我似乎无法弄清楚这一点。
答案 0 :(得分:0)
您编写的代码有几个缺点。我会尝试解释它们,因为不清楚你的代码在哪里失败(可能在你发布的函数之外)
EOF
结果值中检查getchar()
。 getchar(3)
不会准确地返回char
以允许返回可能的char
值加上额外的EOF
来标记文件的结尾(这可以生成来自终端,在unix中输入Ctrl-D
,或在Windows机器上输入Ctrl-Z
这种情况必须在您的代码中明确表示,因为您将结果转换为char
并且丢失您从该功能收到的额外信息。阅读getchar(3)
手册页以解决此问题。另一方面,你有一个标准功能就是这样,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 */