c中的getchar()有问题
我有一个c程序,在我的程序中要求用户输入两次。第一次输入函数(我自己的)运行得很好,但第二次getchar()函数似乎没有运行。我自己也研究过这个问题,发现了一些与尾随字符有关的东西,但我仍然对我的问题感到困惑。我尝试创建第二个函数,如果给定的输入是a\n,则该函数会不断请求输入,并且我还尝试使用额外的getchar()函数来删除输入流中存储的字符(我也不完全理解这一点)。我也尝试过其他方法,但是它们涉及到我的更大的结构,而不是getchar()函数本身 我的输入功能:c中的getchar()有问题,c,input,getchar,C,Input,Getchar,我有一个c程序,在我的程序中要求用户输入两次。第一次输入函数(我自己的)运行得很好,但第二次getchar()函数似乎没有运行。我自己也研究过这个问题,发现了一些与尾随字符有关的东西,但我仍然对我的问题感到困惑。我尝试创建第二个函数,如果给定的输入是a\n,则该函数会不断请求输入,并且我还尝试使用额外的getchar()函数来删除输入流中存储的字符(我也不完全理解这一点)。我也尝试过其他方法,但是它们涉及到我的更大的结构,而不是getchar()函数本身 我的输入功能: int getInput
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);
}
我的主要职能是:
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键时,填充stdin的缓冲区,然后用getchar
清空该缓冲区现在,假设您编写
hello
,然后按Enter键,那么现在缓冲区中填充了hello\n
(因为当您按Enter键时,换行符也被放入缓冲区中)。现在,您的
getchar
将消耗每一个字母,直到缓冲区中没有任何剩余。在这一点上,我想你会认为,getchar
会返回一个EOF,因为没有什么可读的了,但是不要忘记,当没有什么可读的时候,getchar
只会等待你输入类似于scanf
的东西
所以现在你被困在一个循环中,你填充你的输入,它被读取,然后你必须填充另一个输入,你永远不会离开这个循环
解决方案是将循环条件更改为在
getchar
返回\n
时停止(因为记住它也会被添加到缓冲区中),因此此时缓冲区将为空,字符串将正确,函数将返回。EOF是文件的结尾,所以有多个EOF没有多大意义。你应该重新考虑一下设计。还要注意返回一个int
,因此存储返回值的变量应该是int
。使用char
时,可能很难区分字符和EOF。我理解您的意思。谢谢。我是否可以将该字符更改为新行以外的另一个字符来停止循环?我试着用一个竖条“|”,但它仍然不断地要求输入字符,直到我按下一个换行符。你知道有什么办法吗?谢谢,正如您可能猜到的,默认情况下,您必须按enter键才能将您编写的内容提供给您的程序。但是,有一种方法可以满足您的需求: