2010-04-22 27 views
6

tengo una cadena del formato "ABCDEFG, 12: 34: 56: 78: 90: 11". Quiero separar estos dos valores que están separados por comas en dos cadenas diferentes. ¿Cómo hago eso en gcc usando el lenguaje c?Analizando una cadena

+0

No es claro qué tipo de comprobación de sintaxis qué necesita. ¿Estás tratando de hacer CSV? ¿Los primeros personajes tienen que estar en mayúscula? –

Respuesta

7

Una posibilidad es algo como esto:

char first[20], second[20]; 

scanf("%19[^,], %19[^\n]", first, second); 
+0

¡maldición! quise votar pero tuve un accidente con el mouse inalámbrico y ya no puedo votar sobre esta respuesta. considere este comentario como +1 :) – atzz

+0

+1 para la solución más simple y para usarla de manera segura. – jweyrich

3
char str[] = "ABCDEFG,12:34:56:78:90:11"; //[1] 

char *first = strtok(str, ","); //[2] 
char *second = strtok(NULL, ""); //[3] 

[1] ABCDEFG,12:34:56:78:90:11 

[2] ABCDEFG\012:34:56:78:90:11 
    Comma replaced with null character with first pointing to 'A' 

[3] Subsequent calls to `strtok` have NULL` as first argument. 
    You can change the delimiter though. 

Note: you cannot use "string literals", because `strtok` modifies the string. 
+0

me da error de segmentación al probar esto? ¿cuál puede ser el motivo? – sfactor

+1

@sfactor - probablemente esté llamando a 'strtok (" ABCD, etc. ",", ")' - es decir, pasar un literal de cadena a 'strtok'. Y 'strtok' funciona modificando la cadena original - reemplaza separadores (',') con caracteres nulos. Esta es una de las razones por las que no recomendaría 'strtok' incluso a mi enemigo :). (La segunda razón es que mantiene un estado global y, por lo tanto, no reentrante y puede no ser seguro para subprocesos). – atzz

+0

@sfactor: aparte de lo que ya ha dicho atzz, asegúrese de que la cadena a la que llama strtok esté terminada en nulo. ¿Puedes publicar exactamente lo que estás usando? –

1

Puede utilizar strtok que le permitirá especificar el separador y generar las fichas para usted.

1

Usted podría utilizar strtok:

Ejemplo de cppreference.com:

char str[] = "now # is the time for all # good men to come to the # aid of their country"; 
char delims[] = "#"; 
char *result = NULL; 
result = strtok(str, delims); 
while(result != NULL) { 
    printf("result is \"%s\"\n", result); 
    result = strtok(NULL, delims); 
} 
3

Así que muchas personas están sugiriendo strtok ... ¿Por qué? strtok es un sobrante de la edad de piedra de la programación y solo es bueno para las utilidades de 20 líneas.

Cada llamada a strtok modifica strToken insertando un carácter nulo después del token devuelto por esa llamada. [...] [F] unction usa una variable estática para analizar la cadena en tokens. [...] La intercalación de llamadas a esta función es altamente probable que produzca corrupción de datos y resultados inexactos.

scanf, como en Jerry Ataúd de answer, es una alternativa mucho mejor. O bien, puede hacerlo manualmente: encuentre el separador con strchr, luego copie las partes en separadores separados.

-1

Trate de usar la siguiente expresión regular se encontrará nada con caracteres az AZ seguido de un ""

"[AZ] ," si necesita letra minúscula demasiado probar "[a-zA-Z], "

Si lo necesita para buscar la segunda parte primero puede probar con el siguiente

", [0-9] {2}: [0-9] {2}: [0- 9] {2}: [0-9] {2}: [0-9] {2}: [0-9] {2} "

Hay un ejemplo sobre cómo usar REGEX en http://ddj.com/184404797

Gracias, V $ h3r