【发布时间】: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
我想从控制台读取一些数字。数字会这样出现——
5 1 2 3 4 5
4 5 6 7 8
6 2 3 4 5 6 7
..............
EOF
起始数字表示该行将出现多少个数字,即第一行的第一个数字是5,因此该行将多出5个数字。输入结束将由 EOF(文件结束)表示。
我想将整行作为字符串读取,然后将它们转换为数字,但我想知道有没有其他方法可以做到这一点。
【问题讨论】:
标签: c
“标准”答案是scanf()。标准答案的问题在于它不允许您检查一行中的数字是否正确。因此,您读取一行然后将其逐个转换的想法对于错误检测要好得多。
看看How to use sscanf() in loops;那里的答案向您展示了您应该做什么的基础知识。它不是完全重复的。您将读取第一个值来识别行中有多少条目,然后读取将这些条目读取到数组中的代码,如果数据与为其声明的格式不匹配,则会进行适当的诊断。
如果您负责数据格式,则应考虑删除计数字段 - 让计算机计算一行中有多少值。计算机擅长计数,它消除了需要检测和处理的错误来源(因此它使编程更容易)。 (如果您确实更改了输入格式,您的问题将成为链接问题的副本。)
【讨论】:
看看scanf的文档:
int count, current, i;
while(scanf("%d", &count) > 0)
{
for(i = 0; i < count; i++)
{
scanf("%d", ¤t);
// store current
}
}
【讨论】:
scanf() 将吃掉早期出现的换行符并忽略出现较晚的换行符。给定数据1 1 3 / 1 2(其中斜线是换行符),第一行将是“OK”(即使它包含 2 个值,而不是 1),并且 3 将被解释为“第二个”的计数行,它只有 2 个值。这就是为什么scanf() 很少使用正确的函数的原因。 (我在 SO 上使用 scanf() 的次数比我在过去 25 年的编程中更多!)
scanf 文档。