可预测的每行扫描数量(scanf)

时间:2015-11-22 22:24:20

标签: c scanf ansi-c

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

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

但它等了一个号码才能完成扫描。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

关键问题是"%d"int扫描之前先读取前导空格。 区分' ''\n',这对于使用scanf()

阅读每个至关重要

最好的方法是使用fgets()读入缓冲区然后 使用intstrtol()解析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()进行解析。