【问题标题】:scanf holds output from appearingscanf 保持输出不出现
【发布时间】:2013-12-20 23:17:57
【问题描述】:

scanf() 如何阻止 printf 的输出出现在屏幕上?循环必须在迭代,因为 i 的值正在增加,如输出所示。澄清一下,循环如何在不显示 printf 输出的情况下进行迭代?

代码:

char string[100] = {0};
char chr = 0;
int i = 0;
printf("Please enter the string you would like reversed:\n");
while (chr != '\n'&& i<99)
{
    scanf("%c", &chr);
    string[i] = chr;
    printf("%d %c\n", i,chr);
    i++;
}

输出:

Please enter the string you would like reversed:
This is a test
0 T
1 h
2 i
3 s
4
5 i
6 s
7
8 a
9
10 t
11 e
12 s
13 t
14


Your reversed string is:
tset a si sihT

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    出现此问题是因为 stdin 已缓冲。

    scanf() 不会阻止 printf 的输出出现。就是stdinscanf()开始消费chars之前显示为This is a test\n

    在您按下回车键 (\n) 之前,scanf() 无法使用该输入。对scanf("%c", &amp;chr) 的第一次呼叫然后将1 个char 取出。对scanf() 的第二次调用无需等待,因为可以从stdin 获得数据。 chars “这是一个测试\n”由 scanf("%c", &amp;chr) 一次读取一个。

    如果代码再次循环并调用scanf("%c", &amp;chr),该过程将重复。

    【讨论】:

    • 但是第二次循环之前不是遇到了printf吗?
    • @bh3244 printf("Please... 在第一个循环打印“请输入...”之前遇到。您输入“这是一个测试\n”,它会在控制台上回显。然后在看到\n 之后,数据就可以提供给scanf()。然后出现多个printf("%d %c\n", i,chr);
    • 但是 scanf() 一次只能读取和存储一个字符,所以它必须循环才能存储下一个字符,但是 printf("%d %c\n", i, chr) 在路上。标准输出是否等到标准输入消失后再输出?如果是这样,是什么迫使编译器、操作系统?
    • @bh3244 不,以下内容不太正确:“scanf() 一次只读取和存储一个字符”。第一次出现scanf() 表示它需要来自stdincharstdin缓冲。它不提供任何char 回到scanf(),直到具有\n,如“这是一个测试\n”。所以scanf() 等到\n 到达。然后scanf()stdin (T) 中取出1 个char 并返回。在第二次调用时,h 已准备好等待,然后它立即得到。
    【解决方案2】:

    这是因为只有在你按下回车后输出才会刷新到输出窗口,直到它被缓冲

    stdout 流是缓冲的,所以只会显示 到达换行符(或被告知)后的缓冲区。你有一个 立即打印的几个选项:

    使用 fprintf 打印到 stderr:

    fprintf(stderr, "I will be printed immediately");
    

    在需要时刷新标准输出以使用 fflush:

    printf("Buffered, will be flushed");
    fflush(stdout); // Will now print everything in the stdout buffer
    

    详细解释:

    Why does printf not flush after the call unless a newline is in the format string?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 2019-07-07
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多