【问题标题】:How to input numbers from console如何从控制台输入数字
【发布时间】:2011-05-28 14:27:23
【问题描述】:

我想从控制台读取一些数字。数字会这样出现——

5 1 2 3 4 5
4 5 6 7 8
6 2 3 4 5 6 7
..............
EOF

起始数字表示该行将出现多少个数字,即第一行的第一个数字是5,因此该行将多出5个数字。输入结束将由 EOF(文件结束)表示。

我想将整行作为字符串读取,然后将它们转换为数字,但我想知道有没有其他方法可以做到这一点。

【问题讨论】:

    标签: c


    【解决方案1】:

    “标准”答案是scanf()。标准答案的问题在于它不允许您检查一行中的数字是否正确。因此,您读取一行然后将其逐个转换的想法对于错误检测要好得多。

    看看How to use sscanf() in loops;那里的答案向您展示了您应该做什么的基础知识。它不是完全重复的。您将读取第一个值来识别行中有多少条目,然后读取将这些条目读取到数组中的代码,如果数据与为其声明的格式不匹配,则会进行适当的诊断。

    如果您负责数据格式,则应考虑删除计数字段 - 让计算机计算一行中有多少值。计算机擅长计数,它消除了需要检测和处理的错误来源(因此它使编程更容易)。 (如果您确实更改了输入格式,您的问题将成为链接问题的副本。)

    【讨论】:

      【解决方案2】:

      看看scanf的文档:

      int count, current, i;
      while(scanf("%d", &count) > 0)
      {
         for(i = 0; i < count; i++)
         {
             scanf("%d", &current);
             // store current
         }
      }
      

      【讨论】:

      • 你错过了在 for 循环中测试 scanf 的返回值。
      • 你也无法知道你是否在应该这样做的时候到达了行尾。 scanf() 将吃掉早期出现的换行符并忽略出现较晚的换行符。给定数据1 1 3 / 1 2(其中斜线是换行符),第一行将是“OK”(即使它包含 2 个值,而不是 1),并且 3 将被解释为“第二个”的计数行,它只有 2 个值。这就是为什么scanf() 很少使用正确的函数的原因。 (我在 SO 上使用 scanf() 的次数比我在过去 25 年的编程中更多!)
      • @Neil Butterworth:我没有添加它,因为问题中没有提到它,但是如果需要,OP 可以这样做,前提是他阅读了scanf 文档。
      • @Jonathan Leffler:这个问题的措辞看起来像是一项编程作业,只输入有效数据,因此不必担心您提到的情况。不过,OP 应该意识到这一点。
      猜你喜欢
      • 1970-01-01
      • 2011-04-02
      • 2015-05-17
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多