2009-12-07 19 views
5

que tienen la secuencia: "[email protected]"subseries de extracción en C

Busco escribir un programa C que extra de los tres subseries ("foo", "bar" y "baz") y poner a cada uno en su propia cadena.

P.S. No te preocupes, esto es no deberes.

+0

Por cierto, esto parece un dup. – monksy

+0

¿Has hecho algún progreso? Es probable que obtenga más respuestas si hace una pregunta más específica. En este momento le está pidiendo a alguien que escriba el programa completo para usted en el cuadro de respuestas. – benzado

Respuesta

10

Lo que está buscando es strtok. Le permite configurar los delimitadores también.

+4

Siempre que la cadena que se tokenice sea modificable. No haga 'strtok (" foo $ bar @ baz "," $ ");' –

+1

¿Por qué es el puntaje 7 donde hay 9 votos ascendentes y 1 voto negativo? Supongo que a alguien no le gusta strtok ... raro. – monksy

1

si no es para :-) tarea de strtok no es recomendable, si no se puede utilizar C++ (¿por qué?), Debe usar strtok_r (versión reentrent)

0

Strtok mantiene un buffer estático cuando tokenizar que se sobrescribe cuando se llama a otra parte con una nueva cadena no nula, lo que podría romper la funcionalidad que está buscando. p.ej. llamadas entrelazadas con diferentes cadenas.

En su lugar, puede usar strsep, que es como strtok, pero usted mismo guarda el búfer temporal, en caso de que necesite tokenizar varias cadenas, p. con las llamadas entretejidas con diferentes cadenas.

En casos pequeños, este problema probablemente no se presente, pero sí en proyectos de mayor envergadura.

EDITAR: esto no es estándar c, así que asegúrese de tener esta función antes de intentar usarlo. Sé con certeza que está disponible en BSD, y posiblemente otra de UNIX

EDIT: strsep y strtok_r parecen tener la misma funcionalidad

1

Dado que este es C recta, que podría ser divertido volver a examinar cómo se almacenan las cadenas y terminado. Puesto que usted tiene un carácter de terminación para cada sección, sólo puede hacerlo en una verdadera terminador ('\ 0') y dejar las cuerdas en su lugar:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char **argv) { 

char *s1,*s2,*s3, *test = "[email protected]"; 
char *buf=(char *)malloc(100); 
char *p,c; 

strcpy(buf, test); 

s1 = p = buf; 
while(c = *p) { 
    if (c == '$') { *p = '\0'; s2 = p+1; } 
    if (c == '@') { *p = '\0'; s3 = p+1; } 
    p++; 
} 

printf("s1 = %s\n",s1); 
printf("s2 = %s\n",s2); 
printf("s3 = %s\n",s3); 

} 

yo no haría esto en el código de producción, en este día y edad. Pero mucho tiempo atrás, hacer un pase en el ciclo y una copia de almacenamiento, se habría considerado una gran victoria.

+0

Malo, 2 pasa si cuentas el strcpy. Un ciclo de copiar y ajustar se deja como un ejercicio para el lector. –

+0

que no hacer una copia primero :) – warren