Usar strtok en c

Necesito usar strtok para leer en un nombre y apellido y separarlo. ¿Cómo puedo almacenar los nombres donde puedo usarlos independientemente en dos matrices de caracteres separadas?

#include  #include  int main () { char str[] ="test string."; char * test; test = strtok (str," "); while (test != NULL) { printf ("%s\n",test); test= strtok (NULL, " "); } return 0; } 

Aquí está mi opinión sobre un ayudante tokenize razonablemente simple que

  • almacena los resultados en una matriz de crecimiento dynamic
  • terminación nula de la matriz
  • mantiene segura la cadena de entrada (strtok modifica la cadena de entrada, que es un comportamiento indefinido en un char literal [], al menos creo que en C99)

Para hacer que el código vuelva a entrar, utilice el strtok_r no estándar

 #include  #include  #include  char** tokenize(const char* input) { char* str = strdup(input); int count = 0; int capacity = 10; char** result = malloc(capacity*sizeof(*result)); char* tok=strtok(str," "); while(1) { if (count >= capacity) result = realloc(result, (capacity*=2)*sizeof(*result)); result[count++] = tok? strdup(tok) : tok; if (!tok) break; tok=strtok(NULL," "); } free(str); return result; } int main () { char** tokens = tokenize("test string."); char** it; for(it=tokens; it && *it; ++it) { printf("%s\n", *it); free(*it); } free(tokens); return 0; } 

Aquí hay una reimplementación de strpbrk de eso (usa strpbrk en strpbrk lugar):

 char** tokenize(const char* str) { int count = 0; int capacity = 10; char** result = malloc(capacity*sizeof(*result)); const char* e=str; if (e) do { const char* s=e; e=strpbrk(s," "); if (count >= capacity) result = realloc(result, (capacity*=2)*sizeof(*result)); result[count++] = e? strndup(s, es) : strdup(s); } while (e && *(++e)); if (count >= capacity) result = realloc(result, (capacity+=1)*sizeof(*result)); result[count++] = 0; return result; } 

¿Necesita almacenarlos por separado? Dos punteros en una matriz de caracteres modificada producirán dos cadenas perfectamente utilizables por separado.

Eso es lo que transformamos esto:

 char str[] ="test string."; 

Dentro de esto:

 char str[] ="test\0string."; ^ ^ | | char *s1 ----- | char *s2 ----------- 

.

 #include  #include  int main () { char str[] ="test string."; char *firstname = strtok(str, " "); char *lastname = strtok(NULL, " "); if (!lastname) lastname = ""; printf("%s, %s\n", lastname, firstname); return 0; } 

¿Qué hay de usar strcpy ?

 #include  #include  #include  #define MAX_NAMES 2 int main () { char str[] ="test string."; char *names[MAX_NAMES] = { 0 }; char *test; int i = 0; test = strtok (str," "); while (test != NULL && i < MAX_NAMES) { names[i] = malloc(strlen(test)+1); strcpy(names[i++], test); test = strtok (NULL, " "); } for(i=0; i 

Contiene mucho desorden para mantener un progtwig completo y limpiar sus recursos, pero el punto principal es usar strcpy para copiar cada token en su propia cadena.

 #include  #include  #include  char** split(const char *str, const char *delimiter, size_t *len){ char *text, *p, *first, **array; int c; char** ret; *len = 0; text=strdup(str); if(text==NULL) return NULL; for(c=0,p=text;NULL!=(p=strtok(p, delimiter));p=NULL, c++)//count item if(c==0) first=p; //first token top ret=(char**)malloc(sizeof(char*)*c+1);//+1 for NULL if(ret==NULL){ free(text); return NULL; } strcpy(text, str+(first-text));//skip until top token array=ret; for(p=text;NULL!=(p=strtok(p, delimiter));p=NULL){ *array++=p; } *array=NULL; *len=c; return ret; } void free4split(char** sa){ char **array=sa; if(sa!=NULL){ free(array[0]);//for text free(sa); //for array } } int main(void){ char str[] ="test string."; char **words; size_t len=0; int i; words = split(str, " \t\r\n,.", &len); /* for(char **wk = words; *wk ;wk++){ printf("%s\n", *wk); } */ for(i = 0;i 

Copie los resultados de strtok en un nuevo buffer usando una función como

 /* * Returns a copy of s in freshly allocated memory. * Exits the process if memory allocation fails. */ char *xstrdup(char const *s) { char *p = malloc(strlen(s) + 1); if (p == NULL) { perror("memory allocation failed"); exit(1); } strcpy(p, s); return p; } 

No olvides free los valores devueltos cuando hayas terminado con ellos.

OMI, no necesitas (y probablemente no quieras) usar strtok en absoluto (como en “para esto, o para cualquier otra cosa”). Creo que usaría un código como este:

 #include  #include  static char *make_str(char const *begin, char const *end) { size_t len = end-begin; char *ret = malloc(len+1); if (ret != NULL) { memcpy(ret, begin, len); ret[len]='\0'; } return ret; } size_t tokenize(char *tokens[], size_t max, char const *input, char const *delims) { int i; char const *start=input, *end=start; for (i=0; *start && i 

U puede hacer algo como esto también.

  int main () { char str[] ="test string."; char * temp1; char * temp2; temp1 = strtok (str," "); temp2 = strchr(str, ' '); if (temp2 != NULL) temp2++; printf ("Splitted string :%s, %s\n" , temp1 , temp2); return }