【问题标题】:Trouble with getchar() in cc中getchar()的问题
【发布时间】:2021-02-21 02:13:05
【问题描述】:

我有一个 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);
}

谢谢

【问题讨论】:

  • EOF 是文件的 end,因此拥有多个 EOF 没有多大意义。你应该重新考虑设计。还要注意getchar()返回一个int,所以存储返回值的变量应该是int。当使用char 时,可能很难区分字符和EOF。

标签: c input getchar


【解决方案1】:

实际上,您的第一个 getInput 并没有像您期望的那样工作。实际上,这是您的程序卡住的地方,因为getchar 仍在等待输入。

在终端中写入输入并按 Enter 时,您会填充标准输入的缓冲区,然后用 getchar 清空该缓冲区。
现在假设您写了hello,然后按Enter,那么现在您的缓冲区被hello\n 填充(因为当您按Enter 时,换行符也被放入缓冲区)。
现在您的getchar 将消耗每个字母,直到缓冲区中没有任何内容。在这一点上,我猜你虽然getchar 会返回一个EOF,因为没有什么要读了,但不要忘记当没有什么要读的时候getchar 只是等待你输入像scanf 这样的东西。

所以现在你被困在一个循环中,你填充你的输入,它被读取,然后你必须填充另一个输入并且你永远不会离开循环。

解决方案是将循环条件更改为在 getchar 返回 \n 时停止(因为记住它也被添加到缓冲区中),所以此时缓冲区将为空,您的字符串将是正确的你的函数就会返回。

【讨论】:

  • 我明白你在说什么谢谢。我可以更改字符以停止循环到换行符之外的另一个字符吗?我试着用竖线“|”来做,但它仍然一直在询问字符,直到我按下换行符。你知道解决这个问题的任何方法吗?谢谢
  • 您可能已经猜到了,默认情况下,您必须按 Enter 键才能使您编写的内容可用于您的程序。但是,有一种方法可以满足您的需求:stackoverflow.com/a/1798833/15247944
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多