2015-09-20 7 views
0

Мне интересно, почему sscanf работает неправильно. Вот случайизвлечение данных из sscanf

У меня есть строка «1,2,3, #», и я хочу, чтобы извлечь данные без запятой, код

int a1,a2,a3; 
char s; 
string teststr = "1,2,3,#"; 
sscanf(teststr.c_str(), "%d,%d,%d,%s",&a1,&a2,&a3,&s); 
cout << teststr << endl; 
cout << a1 << a2 << a3 << s << endl; 

ожидаемый результат должен быть 123#, но реальный результат я получил, что 120#a3 всегда 0.

Если я расширяю до 4 номеров,

int a1,a2,a3,a4; 
char s; 
string teststr = "1,2,3,4,#"; 
sscanf(teststr.c_str(), "%d,%d,%d,%d,%s",&a1,&a2,&a3,&a4,&s); 
cout << teststr << endl; 
cout << a1 << a2 << a3 << a4 << s << endl; 

Тогда результат становится 1230#. Кажется, что последний int всегда 0. Почему это произойдет? Как это исправить?

+4

' "% d,% d,% d,% s" '->' "% d,% d,% d,% C"' – BLUEPIXY

+0

Спасибо! Это работает! Но почему? – hhh

+2

Если фактический тип аргумента с параметром формата не соответствует UB. '% s' добавить NUL (' '\ 0''), чтобы он уничтожил (перекрутил) память. или должен быть 'char s [2];' ... '% 1s'. – BLUEPIXY

ответ

2
sscanf(teststr.c_str(), "%d,%d,%d,%s",&a1,&a2,&a3,&s); 
           ^passing char variable s to %s (specifier for reading single char is %c not %s) 

Вместо того, чтобы попробовать это -

sscanf(teststr.c_str(), "%d,%d,%d,%c",&a1,&a2,&a3,&s); 
Смежные вопросы