2016-01-30 49 views
6

Mam ciąg znaków, który wygląda tak:sscanf uzyskać wartość pozostałego ciąg

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

próbuję uzyskać Witam, 200, a pozostałe ciąg. Niestety ciąg może zawierać \n i \t, więc nie mogę użyć %[^\n\t].

Próbowałem następujące podejście:

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

potem zmienne to:

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

Czy istnieje sposób to zrobić bez strtok?

+0

Teraz, gdy osiągnąłeś cel, używając '"% s% d% [^ \ 0] "", jakie jest twoje pytanie? –

+1

Nie osiągnęło mojego celu, odpowiedź nie ma pożądanej wartości. Odpowiedź powinna brzmieć "Teraz losowy tekst \ n teraz więcej tekstu \ t \ t" bez HELLO i kodu statusu –

+0

Na moim komputerze, 'odpowiedź' jest dokładnie" Nie ma losowego tekstu \ n teraz więcej tekstu \ t \ t " –

Odpowiedz

6

Można użyć scanset dla całej gamy typu unsigned char:

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

Plus należy zawsze sprawdzić wartość zwracaną z sscanf. Jeśli po numerze jest tylko spacja, trzeci specyfikator niczego nie dopasuje, a sscanf zwróci 2, pozostawiając niezmienioną response.

+0

Zawsze sprawdzam wartość zwracaną, po prostu dla tego krótkiego przykładu nie :) –

6

Specyfikator% n przechwyci liczbę znaków użytych w skanie. Powinno to zapewnić liczbę znaków użytych do zeskanowania pierwszych wartości, a następnie strcpy z tego indeksu.

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