c中的getchar()有问题

c中的getchar()有问题,c,input,getchar,C,Input,Getchar,我有一个c程序,在我的程序中要求用户输入两次。第一次输入函数(我自己的)运行得很好,但第二次getchar()函数似乎没有运行。我自己也研究过这个问题,发现了一些与尾随字符有关的东西,但我仍然对我的问题感到困惑。我尝试创建第二个函数,如果给定的输入是a\n,则该函数会不断请求输入,并且我还尝试使用额外的getchar()函数来删除输入流中存储的字符(我也不完全理解这一点)。我也尝试过其他方法,但是它们涉及到我的更大的结构,而不是getchar()函数本身 我的输入功能: int getInput

我有一个c程序,在我的程序中要求用户输入两次。第一次输入函数(我自己的)运行得很好,但第二次getchar()函数似乎没有运行。我自己也研究过这个问题,发现了一些与尾随字符有关的东西,但我仍然对我的问题感到困惑。我尝试创建第二个函数,如果给定的输入是a\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);
}
我的主要职能是:

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键才能将您编写的内容提供给您的程序。但是,有一种方法可以满足您的需求: