【问题标题】:Using putchar and printf together in the same C Program?在同一个 C 程序中同时使用 putchar 和 printf?
【发布时间】:2013-03-20 05:34:52
【问题描述】:

我编写了一个小型 C 程序,我想在其中显示与某些按键对应的数字 ASCII 值。

我的代码如下。问题是,运行程序后,它接受输入,但不做任何其他事情。它甚至没有到达第一个 printf 语句。我不知道问题出在哪里 - 在同一个程序中将 getchar() 函数与 printf() 函数混合是否有问题?

#include <stdio.h> 

int main() {

    const int numKeys = 256;

    int keys[numKeys];

    int i;
    for (i = 0; i < numKeys; i++) {

        keys[i] = 0;
    }

    printf("\n Start pressing some keys!\n\n");

    int c;
    while ((c = getchar()) != EOF) {

        printf(" CAPTURED: %d\n", c);

        keys[c]++;
    }

    printf("\n\n ** RESULTS ** \n\n");

    for (i = 0; i < numKeys; i++) {

        if (keys[i] != 0) {

            printf(" Key with value %d was called %d times.", i, keys[i]);
        }
    }
}

我应该澄清一下,我有一台安装了 Cygwin 的 Windows XP Pro 机器。我使用 Cygwin 作为我的开发空间,所以我想知道在那个环境中运行这种类型的程序时是否有什么不同。

【问题讨论】:

  • 我认为混合它们没有问题,因为 getch 影响标准输入,而 printf 影响标准输出。我认为问题可能出在其他地方?
  • 你按回车了吗?
  • 它没有达到printf("result")printf(captured)?.如果它是前者那么它这样做是正确的,因为如果你没有得到EOF,它将如何打破while loopgetchar 等待\r\nEnter 被按下。使用 getche。但即便如此,您也会遇到第一个问题
  • 您的程序对我来说运行良好,但话又说回来,我运行的是 Ubuntu Linux。 ctrl+d 给了我一个 EOF,我想 Windows 也有类似的东西。如需有趣的阅读,请查看 c-faq.com/osdep/cbreak.html 以了解无需按 Enter 键即可从标准输入读取字符的方法。

标签: c standard-library


【解决方案1】:

我发现了问题。我想你想使用

while ((c = getchar()) != EOF &amp;&amp; c != '\n')

如果你想让它在用户点击回车后打印结果。

【讨论】:

    【解决方案2】:

    问题 1:无需按 Enter 键即可到达 printf(" CAPTURED: %d\n", c); 解决方案:在while循环中使用getche()

    问题 2:进入 'printf("\n\n ** RESULTS ** \n\n");'还是本质上打破了while循环?

    解决方案:你不能。只要你从键盘上阅读,你就永远不会得到EOF。 解决方法:关闭标准输入或使用EOF 以外的转义字符。

    编辑:解决方法2: -> 使用 getchar() 本身。但是要打印那些输入的字符,你需要按Enter 键。现在在 Windows 上 ctrl+z 给出 EOF 但这应该是您按下 Enter 键后在线上的 **FIRST** 输入。好吧,这不是一个好的解决方案。

    如果你想要一个“按键显示时间按下场景。没有简单的方法(AFAIK)”

    【讨论】:

    • ctrl+d 在我的 Ubuntu Linux 上给我 EOF
    • ctrl+Z 应该在 Windows 中给出 EOF。但有一个条件。我会根据您的评论编辑我的帖子。
    【解决方案3】:

    我相信第一个printf 语句被执行,但由于缓冲没有立即显示在屏幕上。使用fflush(stdout) 将缓冲区的内容发送到屏幕。即:

    printf("\n Start pressing some keys!\n\n");
    fflush(stdout);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 2015-02-25
      相关资源
      最近更新 更多