我需要扫描由空格分隔的可变数量的数字,如
例如dim = 3
void scanNumbers(int dim)
{
// scans dim amount of numbers like "5235435 656435 23423423"
}
有没有一种简短的方法可以做到,比如scanf("<%d * dim>",n1,n2,...到昏暗)或者我必须写一个读取的函数循环中的每个字符?
我试过
int n;
scanf("%d", &n);
int *Data = (int*) malloc (sizeof(int) * (n+1));
for(int i=0; i<n; i++)
scanf("%d ", &Data[i]);
但它等了一个号码才能完成扫描。
答案 0 :(得分:0)
在scanf()
的单次调用中,没有短方法可以扫描可变数量的输入,但编写一个for
循环可以很容易地扫描一个一次数。
答案 1 :(得分:0)
scanf("%d ", &Data[i]);
等待1个号码,因为格式中的以下" "
会指示scanf()
继续扫描,直到数字后遇到非空格。
关键问题是"%d"
在int
扫描之前先读取前导空格。 不区分' '
和'\n'
,这对于使用scanf()
最好的方法是使用fgets()
将行读入缓冲区然后
使用int
或strtol()
解析sscanf()
。
int n;
scanf("%d%*1c", &n);
int Data[n];
char buffer[40*n];
fgets(buffer, sizeof buffer, stdin);
// parsing with sscanf() using %n to determine scanning length
int i;
char *p = buffer;
for(i=0; i<n; i++)
int offset;
if (sscanf(p, "%d %n", &Data[i], &offset) != 1) {
break;
}
p += offset;
}
// use Data[0] ... Data[i-1]
答案 2 :(得分:0)
根据您的信息,我可以说您有两种选择。如果您不知道输入的数量,请使用strtol()
,这将告诉您的用户将哪些用作分隔符;,
或空格。如果您确实知道程序将接收多少输入,请使用fgets()
将行保存到缓冲区,然后sscanf()
进行解析。