1

我需要扫描由空格分隔的可变数量的数字,例如

例如暗淡=3

void scanNumbers(int dim)
{
    // scans dim amount of numbers like "5235435 656435 23423423"
}

有没有一种简单的方法可以做到这一点,比如 scanf("<%d * dim>", n1, n2, ... to dim) 或者我必须编写一个函数来读取循环中的每个字符?

我试过

int n;
scanf("%d", &n);
int *Data = (int*) malloc (sizeof(int) * (n+1));

for(int i=0; i<n; i++)
    scanf("%d ", &Data[i]);

但它会等待另一个号码完成扫描。

4

3 回答 3

0

没有简单的方法可以在一次调用中扫描可变数量的输入scanf(),但是编写一个一次for扫描一个数字的循环相当容易。

于 2015-11-22T22:55:20.493 回答
0

scanf("%d ", &Data[i]);等待另外 1 个数字,因为" "格式中的以下内容指示scanf()继续扫描,直到在数字之后遇到非空白。


关键问题是"%d"在扫描int. 在每行阅读时,它区分哪个是关键的' ''\n'scanf()

最好的方法是将一行读入缓冲区,fgets()然后解析intusing strtol()or 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]
于 2015-11-22T23:55:39.480 回答
0

根据您的信息,我可以说您有两种选择。如果您不知道输入的数量,请使用strtol(),这样您将告诉您的用户使用什么作为分隔符;,或空格。如果您确实知道程序将接收多少输入,请使用fgets()将行保存到缓冲区,然后sscanf()进行解析。

于 2015-11-23T14:15:38.710 回答