2016-01-30 6 views
6

Ich habe einen String, die wie folgt aussieht:sscanf den Wert der restlichen Zeichenfolge erhalten

"HELLO 200 Now some random text\n now more text\t\t" 

Ich versuche, die HALLO zu bekommen, die 200 und die verbleibende Zeichenfolge. Leider kann die Zeichenfolge \n 's und \t' s enthalten, so dass ich %[^\n\t] nicht verwenden kann.

Ich habe versucht, den folgenden Ansatz:

char message[MESSAGE_SIZE], response[RESPONSE_SIZE]; 
int status; 
sscanf (str, "%s %d %[^\0]", message, &status, response); 

danach die Variablen:

message = "HELLO", status = 200, response = "HELLO 200 Now some random text\n now more text\t\t" 

Gibt es eine Möglichkeit, es ohne strtok zu tun?

+0

Jetzt, da Sie Ihr Ziel erreicht haben mit '"% s% d% [^ \ 0] "', was ist Ihre Frage jetzt? –

+1

Hat mein Ziel nicht erreicht, die Antwort hat nicht den gewünschten Wert. Antwort sollte sein "Jetzt einige zufällige Text \ n jetzt mehr Text \ t \ t" ohne den HALLO und Statuscode –

+0

Auf meinem Computer ist "Antwort" genau "Nein einige zufällige Text \ n jetzt mehr Text \ t \ t" –

Antwort

6

Sie könnten Scanset für den gesamten Bereich des unsigned char-Typ:

char message[MESSAGE_SIZE], response[RESPONSE_SIZE]; 
int status; 
*response = '\0'; 
sscanf(str, "%s %d %[\001-\377]", message, &status, response); 

Und Sie sollten den Rückgabewert von sscanf immer überprüfen. Wenn nach der Nummer nur Leerraum vorhanden ist, stimmt der dritte Spezifizierer nicht überein und sscanf gibt 2 zurück, wobei response unverändert bleibt.

+0

Ich überprüfe immer den Rückgabewert, einfach für dieses kurze Beispiel nicht :) –

6

Der% n-Spezifizierer erfasst die Anzahl der Zeichen, die bei einem Scan verwendet werden. Dies sollte die Anzahl der Zeichen erhalten, die beim Scannen der ersten Werte verwendet wurden, und dann von diesem Index strcpy.

int used; 
sscanf (str, "%s %d %n", message, &status, &used); 
strcpy (response, &str[used]);