2010-10-20 10 views
20

Czy istnieje dobry sposób na zapętlenie ciągu znaków z sscanf?Jak korzystać z sscanf w pętlach?

Powiedzmy mam ciąg znaków, który wygląda tak:

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

i chciałbym, aby wydrukować sumę. Co Naprawdę chciałbym napisać to:

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

ale nie ma czysty sposób, aby uzyskać te informacje Spośród sscanf. Jeśli zwróci liczbę zużytych bajtów, byłoby to użyteczne. W takich przypadkach, można po prostu użyć strtok, ale byłoby miło, aby móc napisać coś podobnego do tego, co można zrobić z stdin:

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

istnieje proste rozwiązanie, ja zapominam?

Odpowiedz

35

Sprawdź specyfikator konwersji %n dla rodziny sscanf(). Dostarcza potrzebnych informacji.

#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; 
} 

Zmieniono "line" na "data", ponieważ nie można zwiększyć nazwy tablicy.

+0

+1, pokonałeś mnie. – schot

+1

+1, skąd o tym wiesz? –

+0

@ Zielony kod: W moim przypadku 'man sscanf'. – schot