问题描述
我有一个 c 程序,在我的程序中我要求用户输入两次。第一次输入函数(我自己的)运行良好,但第二次 getchar() 函数似乎没有运行。我自己研究了这个问题,发现了一些与尾随字符相关的东西,但我仍然对我的问题感到困惑。我尝试创建第二个函数,如果给定的输入是 \n,该函数会不断要求输入,并且我还尝试使用额外的 getchar() 函数来删除输入流中存储的字符(我仍然不完全理解这一点)。我也尝试过其他的东西,但它们涉及到我更大的结构,而不是 getchar() 函数本身
我的输入函数:
int getInput(char s[])
{
char c;
int i = 0;
while((c = getchar()) != EOF){
s[i] = c;
i++;
}
return i;
}
我的主要功能:
main()
{
printf("Enter a string to convert: \n");
char s[1000];
int len = getInput(s);
char t[1000];
printf("Press 1 to convert from escape to real,or 2 to convert from real to escape: ");
char a[1];
getInput(a);
printf("%d\n",a[0]);
if(a[0] == '1') {
real(s,t,len);
} else if (a[0] == '2') {
escape(s,len);
} else {
printf("\nRestart the program and enter a 1 or a 2\n");
exit(0);
}
printf("\n%s\n",t);
}
谢谢
解决方法
实际上,您的第一个 getInput
并没有像您期望的那样工作。实际上,这就是您的程序卡住的地方,因为 getchar
仍在等待输入。
在终端中写入输入并按 Enter 时,您会填充 stdin 的缓冲区,然后使用 getchar
清空该缓冲区。
现在假设你写了 hello
然后按 Enter,所以现在你的缓冲区填充了 hello\n
(因为当你按 Enter 时,换行符也被放入缓冲区)。
现在您的 getchar
将消耗每一个字母,直到您的缓冲区中没有任何剩余。在这一点上,我猜你虽然 getchar
会返回一个 EOF,因为没有什么可读的,但不要忘记当没有什么可读的时候 getchar
只是等待你输入一些东西,就像 { {1}}。
所以现在你被困在一个循环中,你填充你的输入,它被读取,然后你必须填充另一个输入,你永远不会离开循环。
一个解决方案是改变你的循环条件以在 scanf
返回 getchar
时停止(因为记住它也被添加到缓冲区中),所以此时缓冲区将是空的,你的字符串将是正确的,您的函数将返回。