Cómo dividir una cadena en 2 cadenas en C

4 minutos de lectura

avatar de usuario
marca szymanski

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.

  • 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

avatar de usuario
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" para char 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


avatar de usuario
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.

avatar de usuario
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'

avatar de usuario
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.

avatar de usuario
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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad