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.
Cómo dividir una cadena en 2 cadenas en C
marca szymanski
ereOn
#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, strtok
La página del manual 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);
}
-
strtok()
modifica su entrada, por lo que usarlo en un literal de cadena es malo juju (también conocido como comportamiento indefinido).– Juan Bode
26 de marzo de 2010 a las 13:23
-
Sí. Me olvidé de mencionar eso. Gracias.
– ereOn
26 de marzo de 2010 a las 13:29
-
creo que si cambias
char *line = "SEVERAL WORDS"
parachar line[] = "SEVERAL WORDS"
ya está todo listo.– Fred Larson
26 de marzo de 2010 a las 14:00
-
@ereOn: los punteros y las matrices son cosas diferentes en C, hasta que estornudas cerca de una matriz y luego se convierte en un puntero. Así es como la expresión de tamaño de matriz
sizeof(arr)/sizeof(arr[0])
obras.–David Thornley
26 de marzo de 2010 a las 14:28
-
strtok()
esta obsoleto? ¡GUAU!strsep()
ni siquiera es estándar C.– pmg
6 de enero de 2013 a las 16:04
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 generará…
‘123456’ ‘789asdf’
Si se necesitan más delimitadores, haga un bucle.
Espero que esto ayude.
-
¿Cuál es la diferencia entre strtok_r() y strtok()?
– thecoshman
26 de marzo de 2010 a las 13:42
-
strtok_r() es la versión reentrante de strtok(). Más sobre la reentrada aquí: en.wikipedia.org/wiki/Reentrant_%28subroutine%29
– ereOn
26 de marzo de 2010 a las 15:55
norte 1.1
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 dé un puntero a la cadena literal.
mkafkas
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 tiene una matriz de caracteres asignada, simplemente puede poner un '\0'
donde quieras. Luego apunte un nuevo puntero char * a la ubicación justo después del recién insertado '\0'
.
Sin embargo, esto destruirá su cadena original dependiendo de dónde coloque el '\0'
mmx
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.
coadicto
Tu puedes hacer:
char str[] ="Stackoverflow 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 Stackoverflow :: Serverfault
Si espera más de un token, es mejor llamar a la segunda y posteriores llamadas a strtok
en un bucle while hasta que el valor de retorno de strtok
se convierte NULL
.
-
Se ve bien, excepto que la segunda llamada a strtok() usa un delimitador diferente.
– Juan Bode
26 de marzo de 2010 a las 13:29
principalmente porque las cadenas no existen, son matrices de caracteres, le resultará difícil dividir una cadena en C
– Woot4Moo
26 de marzo de 2010 a las 13:19
Muéstranos tu intento de strtok().
– Fred Larson
26 de marzo de 2010 a las 13:21
Cuando dice: “He intentado usar strtok(); pero fue en vano”, ¿por qué exactamente no funcionó? ¿Cuál fue el problema con el que te encontraste?
– Juan Bode
26 de marzo de 2010 a las 13:21
¿Puedes mostrar tu código usando
strtok()
?– Naveen
26 de marzo de 2010 a las 13:21
Duplicado: stackoverflow.com/questions/2523624
– Pablo R.
27 de marzo de 2010 a las 20:01