2015-11-22 7 views
1

мне нужно сканировать сменные количество чисел, разделенных пространством, какИзменяемая количество отсканированных чисел в каждой строке (Scanf)

, например тусклым = 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]); 

Но он ждет еще один номер для завершения сканирования.

ответ

0

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] 
0

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

0

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