2015-07-18 3 views
2

Я просто делаю очень простой sscanf, и это не работает, и я понятия не имею, почему (я новичок в C).sscanf не подходит для сопоставления строки

Я считаю, что он должен работать, и я схожу с ума по этому поводу ...

Вот пример кода:

int rval; // return value 
char* buf; 

char* file = "/proc/stat"; 

long unsigned int intr=0, introld=0; 

buf=file2buf(file); 
if((rval=sscanf(buf, "intr %lu", &introld)) < 1) perror("ERROR"); 
printf("buffer: %s\nintrold: %lu\n", buf, introld); 
free(buf); 

И вот что он печатает:

ERROR: Success

buffer: cpu 1226442 3373 193292 19167181 57056 3 154 0 0 0

cpu0 323691 790 47844 4778847 9693 0 62 0 0 0

cpu1 290857 1430 42436 4804284 20607 0 25 0 0 0

cpu2 326087 608 57761 4763973 10862 2 40 0 0 0

cpu3 285805 544 45249 4820075 15893 0 25 0 0 0

intr 48727278 36 26655 0 0 0 0 0 0 1 11277 0 0 3788861 0 0 0 70288 0 0 2 0 0 0 33 0 0 443731 0 25936 1429307 25 893 2807619

introld: 0

Очевидно, Соответствующая строка (intr) есть. Какую очевидную ошибку я делаю?

+3

'sscanf (buf,' -> 'sscanf (strstr (buf," intr "),' – BLUEPIXY

ответ

2

Проблема в вашем буфере. Он содержит «cpu ... blah blah». Для работы sscanf буфер должен начинаться с intr.

Или - как предложено в других комментариях - вы должны маникюрировать строки, передаваемые в функции sscanf, чтобы вы извлекали строку, следующую за intr, и передавали это только на sscanf. (т. е. без cpu + extra guff - И без intr) Попробуйте просто передать номер (строку, содержащую номер), до sccanf, не заставляя его делать соответствующие символы.

Вы можете использовать p=strstr(buf,"intr"), а затем использовать sscanf(p+5,"&lu"...) ... р + 5 будет пропускать символы для «» приемно

+1

То же самое (см. C11, 6.7.2, пункт 2). – cremno

3

scanf family of functions не делает общее соответствие шаблону, он пытается сопоставить вход точно который означает, что строка, которую вы переходите на sscanf, должна начать с "intr", чтобы она могла быть в состоянии соответствовать.

Вам следует подумать о прочтении строки за строкой из файла и попытаться выполнить сравнение, например. strncmp, а затем позвоните по телефону sscanf по соответствующей строке. Или, возможно, найдите библиотеку регулярных выражений.

Смежные вопросы