2011-08-16 12 views
11

¿Hay alguna manera en C para dividir una cadena (usando strtok o de cualquier otra manera) donde el delimitador tiene más de un carácter de longitud? Estoy buscando algo como esto:¿Hay alguna forma de dividir una cadena en varios caracteres en C?

char a[14] = "Hello,World!"; 
char *b[2]; 
b[0] = strtok(a, ", "); 
b[1] = strtok(NULL, ", "); 

Quiero que esto no dividir la cadena porque no hay espacio entre la coma y el W. ¿Hay una manera de hacer eso?

Respuesta

8

Puede llamar repetidamente al substr para encontrar las apariciones de su cadena de límites y dividirlas a lo largo de los resultados. Después de encontrar un resultado, avance el puntero por la longitud de la subcadena y vuelva a buscar.

+0

¿Eso es C o C++? – Jason

+2

Es C si incluye '', y es C++ si dice 'std :: substr' e incluye' ', aunque en C++ no usaría punteros de caracteres desnudos para las cadenas. –

+0

@Kerrek: Depende de lo que esté haciendo. Los pares de punteros de char desnudos funcionan muy bien para analizar archivos de texto mapeados en memoria sin necesidad de copias de datos o asignaciones. Los envuelves en una buena clase, por supuesto. –

4

Puede usar char * strstr(const char *haystack, const char *needle) para ubicar su cadena de delimitadores dentro de su cadena.

char a[14] = "Hello,World!"; 
char b[2] = ", "; 
char *start = a; 
char *delim; 
do { 
    delim = strstr(start, b); 
    // string between start and delim (or end of string if delim is NULL). 
    start = delim + 2; // Use lengthof your b string. 
} while (delim); 
+0

Sin embargo, eso no le dará nada antes del primer delimitador (incluso no le da nada en absoluto en el caso de "¡Hola, Mundo!" –

+0

Gracias Brian. Reparado. –

+1

-1 si strstr devuelve NULL aumentará NULL; 'char * b [2] = "," 'es un error, correcto es' char b [] = ","; 'o' const char * b = ","; ' – user411313

1

¿Algo como esto tal vez? No hay garantías de que esto compila. ;)

char* strstrtok(char *haystack, char *needle) { 
    static char *remaining = null; 
    char *working; 

    if(haystack) 
     working = haystack; 
    else if(remaining) 
     working = remaining; 
    else 
     return NULL; 

    char *result = working; 
    if(result = strstr(working, needle)) 
     remaining = working + strlen(needle) + 1; 

    return result; 
} 
+0

es solo código C99 – user411313

Cuestiones relacionadas