【问题标题】:Printf printing everything in function before completing commands?Printf 在完成命令之前打印功能中的所有内容?
【发布时间】:2013-01-08 16:48:15
【问题描述】:

我这里有一段代码:

Tree *rangeprint(Tree *t) {
  char first[20];
  char last[20];
  int f = 0;
  int l = 0;

  printf("First Entry?\n");

  while(1) {
    first[f] = getchar();
    if(first[f] == '\n') {
      first[f] = '\0';
      break;
    }
    f++;
  }

  printf("Last Entry?\n");

  while(1) {
    last[l] = getchar();
    if(last[l] == '\n') {
      last[l] = '\0';
      break;
    }
    l++;
  }

  printf("%s %s\n", first, last);
}  

当我运行这段代码时,我在控制台中得到的输出是:

First Entry?
Last Entry?

为什么它会跳过 while 循环并在执行之前打印所有内容?

更新 - 我将终止条件更改为 'x' 而不是 '\n' 并且确实可以正确打印。

在循环开始之前添加一个随机 getchar() 可以解决问题,因为 '\n' 被读入其中。

【问题讨论】:

  • 本站没有代码格式化程序...
  • 正确缩进代码应该很容易;只需将代码复制并粘贴到编辑器中,选择它,然后点击 { } 按钮。
  • 它已经被别人格式化了,你只是让它变得更糟
  • 您是在获得 First Entry 后立即输入 CRLF(\n) 还是按 Enter 键?在你的控制台上?
  • 你的调试器说什么?

标签: c printf


【解决方案1】:

它正在打印它们,只是它们是空字符串! (提示:fl 不会改变 - 我认为使用 f 的最后一个循环是一个错字!)

【讨论】:

  • 对不起,我觉得我解释得不是很好。在 printf("First entry") 之后我应该有时间输入一些东西,但是在运行程序时它会跳过它并在第一个条目之后立即打印 Last entry。而且我总是忘记循环中的 f++,我现在已经修复了我的代码。
  • 不幸的是,这似乎并没有改变任何东西。似乎应该可以解决问题,但由于某种原因它没有
  • @Joe,抱歉 fflush 的想法是无稽之谈 - 它仅适用于输出流,您需要手动调用 getchar() 删除任何冗余字符(在这种情况下对您有用,因为有是个流浪者\n)
【解决方案2】:

getchar 从 std in 读取。如果之前的输入中有换行符,可能会导致问题。 顺便说一句,

fflush(stdin);

之后

printf("First Entry?");

【讨论】:

  • 是的,我添加了 fflush,但我仍然遇到同样的问题
  • @Joe:你在哪里添加的?在第一个 while 循环之前?
  • 是的,我在两个 while 循环之前添加了它,它仍然打印第一个和最后一个条目。
  • 我在第一个 printf 之前添加了一个 getchar() 并且它已经解决了问题,因为现在将备用 '\n' 读入那里而不是循环。感谢您为我指明正确的方向。知道为什么 fflush 不起作用吗?
  • @Joe:我也想知道为什么 fflush 不起作用!感谢您的评论
【解决方案3】:

在从输入中读取字符时,您没有推进指针 f。您一直在覆盖位置 0 的 chatacter,最后位置 0 包含 \0

【讨论】:

  • 是的,抱歉,没有正确检查代码。不幸的是,解决这个问题并不能解决我遇到的问题。
【解决方案4】:

尝试在末尾添加一个\n

 printf("First Entry?\n");
 printf("Last Entry?\n");

【讨论】:

    猜你喜欢
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2020-02-25
    相关资源
    最近更新 更多