2016-01-30 15 views
6

ho una stringa che assomiglia a questo:sscanf ottenere il valore della stringa rimanente

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

cerco di ottenere il CIAO, la 200, e la stringa rimanente. Sfortunatamente la stringa può contenere \n e \t così non posso usare %[^\n\t].

ho provato il seguente approccio:

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

poi le variabili sono:

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

C'è un modo per farlo senza strtok?

+0

Ora che hai raggiunto il tuo obiettivo utilizzando '"% s% d% [^ \ 0] "', qual è la tua domanda ora? –

+1

Non ha raggiunto il mio obiettivo, la risposta non ha il valore desiderato. La risposta dovrebbe essere "Ora un testo casuale \ n ora più testo \ t \ t" senza HELLO e codice di stato –

+0

Sul mio computer, 'response' è esattamente" Nessun testo casuale \ n ora più testo \ t \ t " –

risposta

6

Si potrebbe utilizzare scanset per l'intera gamma del tipo unsigned char:

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

Inoltre si deve sempre controllare il valore restituito da sscanf. Se è presente solo uno spazio vuoto dopo il numero, il terzo identificatore non corrisponde a nulla e sscanf restituirà 2, lasciando invariato response.

+0

Controllo sempre il valore restituito, semplicemente per questo breve esempio non :) –

6

L'identificatore% n acquisirà il numero di caratteri utilizzati in una scansione. Questo dovrebbe ottenere il numero di caratteri usati nella scansione dei primi valori e poi stroncare da quell'indice.

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