2010-10-20 10 views
20

¿Hay una buena manera de recorrer una cadena con sscanf?¿Cómo usar sscanf en loops?

Digamos que tengo una cadena que tiene este aspecto:

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

y me gustaría imprimir la suma. Lo que realmente me gusta escribir es la siguiente:

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

pero no hay manera limpia para conseguir que la información de sscanf. Si devuelve la cantidad de bytes consumidos, sería útil. En casos como este, uno sólo puede utilizar strtok, pero sería agradable ser capaz de escribir algo similar a lo que se puede hacer desde stdin:

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

¿Hay una solución simple que estoy olvidando?

Respuesta

35

Busque el especificador de conversión %n para sscanf() y su familia. Te da la información que necesitas.

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

Cambiado 'línea' a 'datos' porque no se puede incrementar el nombre de una matriz.

+0

+1, me ganaste. – schot

+1

+1, ¿cómo lo sabías? –

+0

Código @Green: En mi caso 'man sscanf'. – schot