2010-10-20 21 views
20

C'è un buon modo per eseguire il loop su una stringa con sscanf?Come usare sscanf in loop?

Diciamo che ho una stringa che assomiglia a questo:

char line[] = "100 185 400 11 1000"; 

e mi piacerebbe stampare la somma. Quello che mi piacerebbe davvero scrivere è questo:

int n, sum = 0; 
while (1 == sscanf(line, " %d", &n)) { 
    sum += n; 
    line += <number of bytes consumed by sscanf> 
} 

ma non c'è modo pulito per ottenere tali informazioni da sscanf. Se restituisse il numero di byte consumati, sarebbe utile. In casi come questo, si può solo usare strtok, ma sarebbe bello essere in grado di scrivere qualcosa di simile a quello che si può fare da stdin:

int n, sum = 0; 
while (1 == scanf(" %d", &n)) { 
    sum += n; 
    // stdin is transparently advanced by scanf call 
} 

C'è una soluzione semplice che sto dimenticando?

risposta

35

Cercare lo specificatore di conversione %n per sscanf() e famiglia. Ti dà le informazioni di cui hai bisogno.

#include <stdio.h> 

int main(void) 
{ 
    char line[] = "100 185 400 11 1000"; 
    char *data = line; 
    int offset; 
    int n; 
    int sum = 0; 

    while (sscanf(data, " %d%n", &n, &offset) == 1) 
    { 
     sum += n; 
     data += offset; 
     printf("read: %5d; sum = %5d; offset = %5d\n", n, sum, offset); 
    } 

    printf("sum = %d\n", sum); 
    return 0; 
} 

Modificato "riga" su "dati" perché non è possibile incrementare il nome di un array.

+0

+1, mi hai battuto. – schot

+1

+1, come lo sapevi ??? –

+0

@Green Code: Nel mio caso 'man sscanf'. – schot