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.