Изменяемое количество отсканированных номеров в строке (scanf)

Мне нужно сканировать изменяемое количество чисел, разделенных пробелом, как

например dim=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]);

Но он ждет еще один номер, чтобы закончить сканирование.

3 ответа

Решение

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]

Исходя из вашей информации, я могу сказать, что у вас есть два варианта. Если вы не знаете номер вашего ввода, используйте strtol(), с этим вы скажете своим пользователям, что использовать в качестве разделителя ;, или пробел. Если вы знаете, сколько входов получит программа, используйте fgets() сохранить строку в буфер с последующим sscanf() разобрать.

Нет короткого способа сканировать переменное количество входов за один вызов scanf(), но довольно легко написать for цикл, который сканирует по одному номеру за раз.

Другие вопросы по тегам