【问题标题】:C: Problems with scanf and printfC:scanf 和 printf 的问题
【发布时间】:2014-03-09 17:45:47
【问题描述】:

我在接受用户输入并在 C 中打印其 ascii 值时遇到问题。我的任务是编写一个程序,该程序只需将单个字符作为输入并打印出其 ascii 值,并且仅在用户停止时停止输入 0(0 的 ascii 值为 48)。我的问题是,如果 printf 似乎在 scanf 后面运行一个循环。

while(x == 1){
    scanf("%c\n",&thisChar);
    ascii = thisChar;
    if(ascii == 48){
        x = -1;
    }
    printf("Ascii: %d\n", ascii);
}

例如,当我从命令行运行它时,我会得到如下信息:

f  
0  
Ascii: 102  
f  
Ascii: 48  

然后程序结束。使用相同的输入,我希望输出为:

f  
Ascii: 102  
0  
Ascii: 48  

然后到此结束。我的逻辑有什么错误?

【问题讨论】:

  • "%c\n"更改为" %c"
  • 总是检查scanf函数族的返回值!
  • 请注意,ascii == '0' 完全等同于 ascii == 48,只是更容易理解您的代码的含义。

标签: c printf scanf


【解决方案1】:

\n 字符是问题的根本原因。
改变

 scanf("%c\n",&thisChar);  

 scanf(" %c",&thisChar);  

编辑:OP 问为什么scanf%c 之前的空格对输出很重要?

当您将数据输入程序并按Enter 键时,额外的字符\n 与输入数据一起传递到输入缓冲区。例如:如果您想在程序中输入 f,然后按 Enter 键,输入缓冲区包含 f\n。在循环的第一次迭代中,字符fscanf 读取,在缓冲区中留下\n。在循环的下一次迭代中,\n 会读取此 scanf,从而导致意外输出。
要解决此问题,您需要在下次阅读之前使用此 \n。在scanf 中的%c 说明符之前放置一个空格可以使用任意数量的换行符。

【讨论】:

  • 唯一的区别是空间?我刚刚尝试过,它产生了相同的结果。
  • 从您的 scanf 中删除 \n
  • 好的,成功了!你能解释一下为什么换行符会改变输出吗?
  • 实际上,我只是尝试在 %c 之前没有空格,然后出现新错误。你知道为什么空间很重要吗?
  • 是的。需要解释吗?
【解决方案2】:

您是否考虑过只使用 getchar(3) ? (可能需要fflush(3))...终端中的 stdin 也是一个复杂的野兽。见tty demystified

内核(不仅是libc)有点缓冲每个tty 行(参见line discipline)。

另请参阅 ncursesGNU readline

【讨论】:

    【解决方案3】:

    不要在 scanf() 中使用 \n 。

    删除“\n”并执行

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 2017-11-26
      • 2021-09-17
      • 1970-01-01
      • 2019-02-27
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      相关资源
      最近更新 更多