Изменяемое количество отсканированных номеров в строке (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
цикл, который сканирует по одному номеру за раз.