就像在C中的一切,通常有几种方法来处理它。将数字流分成单独的数字也不例外。您有两种主要方法:(1)使用格式化的读取,从数据流中一次读取数字,如scanf
,或(2)自己将各个字符解析为字符串表示,并调用转换例程,如atoi()
或strtol
。
随着scanf
,你可以简单的从stdin
读取数字,直到输入缓冲区为空:
while (scanf ("%d", &yourvar) == 1) {
/* ... do something with yourvar ... */
}
在第二种情况下,你要么一次读一个字符,直到找到一个数字,然后您将保存/读取/保存字符串中的数字,直到遇到space
,然后将该字符串转换为数字类型(例如int
),使用strtol
或atoi
,处理该数字,然后重复,直到您阅读'\n'
或EOF
。
另一种方法是用fgets
或getline
将整行一次读入缓冲区,然后您将基本上解析缓冲区,就像您将读取一个字符的数字分开一样。
SO上应该有很多例子。这里是在处理收集2个数字为您和单程一个简单的例子:
#include <stdio.h>
int main (void) {
int idx, n, n1;
idx = n = n1 = 0; /* always initialize your variables */
while (scanf ("%d", &n) == 1)
{
if (idx == 0) { /* check simple 0/1 toggle for n, n1 */
n1 = n;
idx = 1;
}
else { /* second number, find sum and char */
int sum = n1 + n;
if (' ' <= sum && sum <= '~')
printf (" sum = (%2d + %2d) = %3d => %c\n",
n1, n, sum, sum);
else
printf (" sum = (%2d + %2d) = %3d => (out of ASCII range)\n",
n1, n, sum);
idx = 0;
}
}
return 0;
}
编译
gcc -Wall -Wextra -o bin/scanf2digitsum scanf_2digitsum.c
示例使用
$ echo "67 5 43 23" | ./bin/scanf2digitsum
sum = (67 + 5) = 72 => H
sum = (43 + 23) = 66 => B
你为什么不把这些数字读作'int'?请在此处添加您的源代码。 – CinCout
如果只用C中的一种方式来**扫描f **格式化的信息而不是像fgetc()那样使用单个字符?我想,如果我要发明这样的东西,我可能会把它称为'scanf()':-) – paxdiablo
也许,但这太明显了。我认为它可能会被称为'strtol',它会包含一个'endptr',允许你转换下一个数字。或者也许更像“atoi”那样神秘吗? –