[C con Clase] problema al tokenizar palabras con la funcion strtok

Steven Richard Davidson stevenrichard.davidson en gmail.com
Lun Nov 5 18:46:01 CET 2007


Hola Ariel,

On 11/5/07, Ariel Romero <aromero en cenatav.co.cu> wrote:
> Hola a todos, tengo un problema al tokenizar palabras con la funcion:
> char *strtok(char *s1, const char *s2);
>
> el problema es que quiero ir leyendo de un fichero e ir separando las
> palabras por sus delimitadores: espacio, comas, puntos, caracteres de
> nueva linea etc etc...
> Pero el problema es que si lo hagocon arreglos dinámicos de caracteres
> es decir usando char* cadena no funciona pero si lo hago con arreglos
> estaticos char cadena[50] por ejemplo sí funciona, necesito que funcione
> con arreglos dinámicos.
> Como se puede hacer con arreglos que varía su longitud ?

Funciona con cualesquier cadenas de caracteres (terminadas en
nulo/cero). Ahora bien, el código que nos envías no se trata de
arrays/arreglos dinámicos. Veamos el cddigo en cuestión.

> De esta otra manera no funciona, da un error: Exception:
> STATUS_ACCESS_VIOLATION
>           char* s1 = "Esto. es, un ejemplo para usar la funcion strtok()";

Esto no es un array dinámico, sino un puntero a un array estático.
Adicionalmente, esta cadena de caracteres es constante.

Para crear un array dinámico, tienes que usar memora dinámica. Por
ejemplo, en C,

char *s1 = (char *) malloc( 128 );

strcpy( s1, "Esto. es, un ejemplo para usar la funcion strtok()" );
...
free( s1 );

>            char s2[6] = " ,.\n\t";
>            char *ptr;
>
>            printf( "s1=%s\n", s1 );
>
>            ptr = strtok( s1, s2 );    // Primera llamada => Primer token
>            printf( "%s\n", ptr );
>            while( (ptr = strtok( NULL, s2 )) != NULL )    // Posteriores
> llamadas
>              printf( "%s\n", ptr );
>            return 0;
>

El error que te da tiene que ver con el comportamiento de 'strtok()'.
Esta función modifica la cadena de caracteres que entregaste en la
primera llamada. Cada vez que se encuentre un carácter separador o
limitante del conjunto que das en cada llamada, la función 'strtok()'
lo cambiará a un carácter nulo. En tu ejemplo, 's1' apuntará a la
siguiente cadena después del bucle 'while':

s1 -> "Esto\0es\0un\0ejemplo\0para\0usar\0la\0funcion\0strtok()\0"

En tu código, la cadena apuntada por 's1' es constante y he aquí el
error en tiempo de ejecución: no puedes modificar caracteres de una
cadena literal; y por tanto constante.


Espero haber aclarado la duda.

Steven




Más información sobre la lista de distribución Cconclase