2016-12-19 27 views
6

Jest to związane z sscanf usage - how to verify a completed scan vs an aborted scan, ale jest to przypadek nieobsługiwany przez to pytanie.dopasowanie końcowego tekstu w 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); 

Oczekiwany wynik: ret1==0; ret2==0; d1, d2 niezdefiniowany.

Rzeczywisty wynik: ret1==1; ret2==1; d1=d2=3.

Użycie na końcu końcówki nie pomoże, ponieważ łańcuchy dopasowania mają jednakową długość. Czy istnieje jakiś zgrabny trik, który pasowałby do końcowego tekstu bez wykonywania kolejnego strncmp lub podobnego?

+0

@ user3121023: Nice! Napisz to jako odpowiedź. –

Odpowiedz

2

Korzystanie "%n" działa dobrze. @user3121023

Poleca używać " %n" aby umożliwić opcjonalną tylną white-space niczym '\n' przekazać "V2X_3_expected\n" i sprawdzić wynik %n niepowodzenie "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 do wartości, która nigdy nie zostanie ustawiony jest skanowanie osiągnął "%n" specyfikator. n1 = 0; działa dobrze w większości przypadków, tak jak w przypadku formatu OP "V2X_%d_ ...".

n1 = -1; /* and (n1 >= 0 */ działa również z krótkimi formatami, takimi jak " %n".

-2

statment powrót scanf wam liczbę przypisanie że mu się uda, więc jeśli poprosić o jeden „wypełnić”

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

i scanf succed wartość zwracana będzie 1;

Jest to całkowicie normalne.

Można znaleźć więcej dokumentacji na temat korzystania z linii poleceń man scanf

+3

Ta odpowiedź, niestety, jest absolutnie poprawna i całkowicie bezużyteczna. –

+0

Mój zły nie rozumiem całego pytania – Zouz