c 中 getchar() 的问题
Trouble with getchar() in c
我有一个 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, t, len);
} else {
printf("\nRestart the program and enter a 1 or a 2\n");
exit(0);
}
printf("\n%s\n", t);
}
谢谢
实际上,您的第一个 getInput
并不像您期望的那样有效。实际上,这就是您的程序卡住的地方,因为 getchar
仍在等待输入。
在您的终端中写入输入并按 Enter 时,您填充了标准输入的缓冲区,然后用您的 getchar
.
清空该缓冲区
现在假设你写 hello
然后按 Enter,所以现在你的缓冲区充满了 hello\n
(因为当你按 Enter 时,换行符也被放入缓冲区)。
现在你的 getchar
将消耗每一个字母,直到你的缓冲区中没有任何剩余。在这一点上我猜你虽然 getchar
会 return 一个 EOF 因为没有什么可读的但是不要忘记当没有什么可读时 getchar
只是等待你输入就像 scanf
.
所以现在你陷入了一个循环,你填写你的输入,它被读取,然后你必须填写另一个输入并且你永远不会离开循环。
一个解决方案是将循环条件更改为在 getchar
return 时停止 \n
(因为记住它也被添加到缓冲区中),所以在这一点上缓冲区将为空,您的字符串将是正确的并且您的函数将 return.
我有一个 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, t, len);
} else {
printf("\nRestart the program and enter a 1 or a 2\n");
exit(0);
}
printf("\n%s\n", t);
}
谢谢
实际上,您的第一个 getInput
并不像您期望的那样有效。实际上,这就是您的程序卡住的地方,因为 getchar
仍在等待输入。
在您的终端中写入输入并按 Enter 时,您填充了标准输入的缓冲区,然后用您的 getchar
.
清空该缓冲区
现在假设你写 hello
然后按 Enter,所以现在你的缓冲区充满了 hello\n
(因为当你按 Enter 时,换行符也被放入缓冲区)。
现在你的 getchar
将消耗每一个字母,直到你的缓冲区中没有任何剩余。在这一点上我猜你虽然 getchar
会 return 一个 EOF 因为没有什么可读的但是不要忘记当没有什么可读时 getchar
只是等待你输入就像 scanf
.
所以现在你陷入了一个循环,你填写你的输入,它被读取,然后你必须填写另一个输入并且你永远不会离开循环。
一个解决方案是将循环条件更改为在 getchar
return 时停止 \n
(因为记住它也被添加到缓冲区中),所以在这一点上缓冲区将为空,您的字符串将是正确的并且您的函数将 return.