每行扫描数字的可变数量(scanf)

Changable amount of scanned numbers per line (scanf)

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

例如暗淡=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]);

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

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

scanf("%d ", &Data[i]);等1个号码,因为格式后面的" "指示scanf()继续扫描,直到号码后遇到非白space。


关键问题是 "%d" 在扫描 int 之前首先读取前导白色-space。它区分' ''\n',这在使用scanf()[阅读时很重要

最好的方法是用 fgets() 读入缓冲区,然后 使用 strtol()sscanf().

解析 int
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]

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