2016-12-19 6 views
6

Это связано с sscanf usage - how to verify a completed scan vs an aborted scan, но это краевой кейс, на который не распространяется этот вопрос.Соответствующий текст в sscanf?

char entry[] = "V2X_3_accepted"; 
int d1,d2,ret1,ret2; 
ret1 = sscanf(entry,"V2X_%d_expected",&d1); 
ret2 = sscanf(entry,"V2X_%d_received",&d2); 

Ожидаемый результат: ret1==0; ret2==0; d1, d2 undefined.

Фактический результат: ret1==1; ret2==1; d1=d2=3.

Использование %n в конце не поможет, так как строки соответствия равны по длине. Есть ли какой-то аккуратный трюк, чтобы соответствовать завершающему тексту без выполнения последовательного strncmp или подобного?

+0

@ user3121023: Nice! Отправьте это как ответ. –

ответ

2

Использование "%n" работает отлично. @user3121023

Рекомендуется использовать " %n", чтобы дополнительно трейлинг бело-пространстве, как '\n' пройти "V2X_3_expected\n" и проверить %n результат к сбою "V2X_3_expected 123".

char entry[] = "V2X_3_accepted"; 

int d1,d2; 
int n1 = 0; 
int n2 = 0; 

sscanf(entry,"V2X_%d_expected %n",&d1, &n1); 
sscanf(entry,"V2X_%d_received %n",&d2, &n2); 
if (n1 > 0 && entry[n1] == '\0') Success_expected(d1); 
else if (n2 > 0 && entry[n2] == '\0') Success_received(d2); 
else Fail(entry); 

Initialize n1 к значению, которое никогда не будет установлен в сканировании достиг "%n" спецификатор. n1 = 0; хорошо работает в большинстве случаев, как в формате OP "V2X_%d_ ...".

n1 = -1; /* and (n1 >= 0 */ также работает с короткими форматами, такими как " %n".

-2

Возвращения Постулаты из зсапЕ сказать вам число свиданий, что добиться успеха, так что если вы попросите одного «заполнить»

ret1 = sscanf(entry,"V2X_%d_expected",&d1);

и зсап succed возвращаемого значения будет 1;

Так что это абсолютно нормально.

Вы можете найти более подробную документацию об использовании командной строки man scanf

+3

Этот ответ, к сожалению, абсолютно правильный и совершенно бесполезный. –

+0

Мой плохой я не понимаю весь вопрос – Zouz

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

  • Нет связанных вопросов^_^