una separar por letras extraer comas caracteres cadena c string strtok

separar - Cómo dividir una cadena en 2 cadenas en C



separar letras de una cadena en c (8)

Me preguntaba cómo podría tomar 1 cadena, dividirla en 2 con un delimitador, como el espacio, y asignar las 2 partes a 2 cadenas separadas. He intentado usar strtok() pero fue en vano.


Así es como implementa una strtok() similar a strtok() (tomada de una biblioteca de procesamiento de cadenas BSD con licencia para C, llamada zString ).

La función inferior difiere del estándar strtok() en la forma en que reconoce los delimitadores consecutivos, mientras que el estándar strtok() no lo hace.

char *zstring_strtok(char *str, const char *delim) { static char *static_str=0; /* var to store last address */ int index=0, strlength=0; /* integers for indexes */ int found = 0; /* check if delim is found */ /* delimiter cannot be NULL * if no more char left, return NULL as well */ if (delim==0 || (str == 0 && static_str == 0)) return 0; if (str == 0) str = static_str; /* get length of string */ while(str[strlength]) strlength++; /* find the first occurance of delim */ for (index=0;index<strlength;index++) if (str[index]==delim[0]) { found=1; break; } /* if delim is not contained in str, return str */ if (!found) { static_str = 0; return str; } /* check for consecutive delimiters *if first char is delim, return delim */ if (str[0]==delim[0]) { static_str = (str + 1); return (char *)delim; } /* terminate the string * this assignmetn requires char[], so str has to * be char[] rather than *char */ str[index] = ''/0''; /* save the rest of the string */ if ((str + index + 1)!=0) static_str = (str + index + 1); else static_str = 0; return str; }

A continuación se muestra un código de ejemplo que demuestra el uso

Example Usage char str[] = "A,B,,,C"; printf("1 %s/n",zstring_strtok(s,",")); printf("2 %s/n",zstring_strtok(NULL,",")); printf("3 %s/n",zstring_strtok(NULL,",")); printf("4 %s/n",zstring_strtok(NULL,",")); printf("5 %s/n",zstring_strtok(NULL,",")); printf("6 %s/n",zstring_strtok(NULL,",")); Example Output 1 A 2 B 3 , 4 , 5 C 6 (null)

Incluso puedes usar un bucle while (el strtok() la biblioteca estándar daría el mismo resultado aquí)

char s[]="some text here; do { printf("%s/n",zstring_strtok(s," ")); } while(zstring_strtok(NULL," "));


Para propósitos como este, tiendo a usar strtok_r () en lugar de strtok ().

Por ejemplo ...

int main (void) { char str[128]; char *ptr; strcpy (str, "123456 789asdf"); strtok_r (str, " ", &ptr); printf ("''%s'' ''%s''/n", str, ptr); return 0; }

Esto producirá ...

''123456'' ''789asdf''

Si se necesitan más delimitadores, entonces haga un bucle.

Espero que esto ayude.


Puedes usar strtok () para ese ejemplo: funciona para mí

#include <stdio.h> #include <string.h> int main () { char str[] ="- This, a sample string."; char * pch; printf ("Splitting string /"%s/" into tokens:/n",str); pch = strtok (str," ,.-"); while (pch != NULL) { printf ("%s/n",pch); pch = strtok (NULL, " ,.-"); } return 0; }


Si está dispuesto a cambiar la cadena original, simplemente puede reemplazar el delimitador con /0 . El puntero original apuntará a la primera cadena y el puntero al carácter después del delimitador apuntará a la segunda cadena. Lo bueno es que puede usar ambos punteros al mismo tiempo sin asignar ningún búfer de cadena nuevo.


Si tiene una matriz de caracteres asignada, simplemente puede poner un ''/0'' donde lo desee. Luego, apunte un nuevo puntero a la ubicación * justo después del ''/0'' recién insertado.

Esto destruirá su cadena original, sin embargo, dependiendo de dónde coloque el ''/0''


Tu puedes hacer:

char str[] =" Serverfault"; char piece1[20] = "" ,piece2[20] = ""; char * p; p = strtok (str," "); // call the strtok with str as 1st arg for the 1st time. if (p != NULL) // check if we got a token. { strcpy(piece1,p); // save the token. p = strtok (NULL, " "); // subsequent call should have NULL as 1st arg. if (p != NULL) // check if we got a token. strcpy(piece2,p); // save the token. } printf("%s :: %s/n",piece1,piece2); // prints :: Serverfault

Si espera que más de un token, es mejor llamar a la segunda y posteriores llamadas a strtok en un bucle de tiempo hasta que el valor de retorno de strtok convierta en NULL .


#include <string.h> char *token; char line[] = "SEVERAL WORDS"; char *search = " "; // Token will point to "SEVERAL". token = strtok(line, search); // Token will point to "WORDS". token = strtok(NULL, search);

Actualizar

Tenga en cuenta que en algunos sistemas operativos, la página de manual de strtok menciona:

Esta interfaz está obsoleta por strsep (3).

Un ejemplo con strsep se muestra a continuación:

char* token; char* string; char* tofree; string = strdup("abc,def,ghi"); if (string != NULL) { tofree = string; while ((token = strsep(&string, ",")) != NULL) { printf("%s/n", token); } free(tofree); }


char *line = strdup("user name"); // don''t do char *line = "user name"; see Note char *first_part = strtok(line, " "); //first_part points to "user" char *sec_part = strtok(NULL, " "); //sec_part points to "name"

Nota: strtok modifica la cadena, así que no le des un puntero a la cadena literal.