【问题标题】:Character input in scanf("%d", &value) [duplicate]scanf("%d", &value) 中的字符输入
【发布时间】:2014-09-20 06:03:18
【问题描述】:

简而言之,我的代码是,

#include <stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    while(n != 0)
    {
        scanf("%d", &n);
        printf("%d\n", n);
    }
    return 0;
}

它是为integer 输入而编写的。但是,如果我改为输入 character(尽管 n 被取消为 integer),则循环将变为无限并打印最后一个 integer 输入值。如果我一开始输入character,它似乎会打印一个内存地址。我的问题是,如果我输入 character 而不是 integer,会发生什么?

【问题讨论】:

  • @ricky2527 你为什么这么认为?它有一个断裂条件。
  • 输入字符时程序好像自动终止了,你确定代码是对的吗?
  • @salmanwahed,我建议您检查scanf() 的返回码以进行更多控制:成功时,该函数返回参数列表中成功填充的项目数。由于匹配失败、读取错误或到达文件结尾,此计数可能与预期的项目数匹配或更少(甚至为零)。
  • 我希望这个引用 scanf() fails why?,因为这个问题的答案包括明确地测试来自 fscanf() 的返回值,而当前的副本并没有真正做到这一点。

标签: c printf scanf


【解决方案1】:

当 scanf 失败时,它不会从输入缓冲区中删除字符(它会在成功时从缓冲区中删除数据)。因此,下次在循环中触发 scanf 时,它根本不会等待用户输入(因为它的缓冲区中有一个未读字符)。但它一次又一次地失败(因为每次失败),因此将进入无限循环。

我坚信第一个 scanf 包含 %c 作为格式说明符。
您可以通过

摆脱无限循环

if(scanf("%d",&amp;n)==0) break;

【讨论】:

    【解决方案2】:

    实际上当另一个字符被插入时,它不会被当作输入,它存在于输入缓冲区中,它不能被控制字符串读取。

    %d控制字符串用于读取整型字符直到其他字符。

    由于没有读取任何内容而插入另一个字符时,循环继续运行并打印变量的存在值。

    【讨论】:

      【解决方案3】:

      scanf("%d", &amp;n); 表示只从标准输入获取数字数据,如1、2。

      因此,如果您在第二个输入中键入char,例如'a'、'b',则输入字符不会存储在&amp;n 中。 n 仍有第一个输入数字数据。

      因此,无限循环来了。

      【讨论】:

      • 如果根本没有存储字符,那么输入缓冲区应该包含零,这意味着根本不执行while循环。
      猜你喜欢
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      相关资源
      最近更新 更多