c 中 getchar() 的问题

问题描述

我有一个 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 时停止(因为记住它也被添加到缓冲区中),所以此时缓冲区将是空的,你的字符串将是正确的,您的函数将返回。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...