Pregunta

he desarrollado mi propia versión de strtok. Sólo para practicar el uso de punteros.

Puede alguien ver ninguna limitación con este o de cualquier manera que pueda mejorar.

void stvstrtok(const char *source, char *dest, const char token) 
{
    /* Search for the token. */
    int i = 0;
    while(*source)
    {
        *dest++ = *source++;
        if(*source == token)
        {
            source++;
        }
    }
    *dest++ = '\0';
    }

int main(void)
{
    char *long_name = "dog,sat ,on ,the,rug,in ,front,of,the,fire";
    char buffer[sizeof(long_name)/sizeof(*long_name)];

    stvstrtok(long_name, buffer, ',');

    printf("buffer: %s\n", buffer);

   getchar();

   return 0;
}
¿Fue útil?

Solución

Una nota al margen: La palabra 'testigo' se utiliza generalmente para describir las partes de la cadena que se devuelven. Delimitador se usa para describir lo que separa las fichas. Así que para que su código sea más clara que debe cambiar el nombre de contadores a delimitador de cambiar el nombre de un destino a una y token_dest.

Las diferencias en su función y strtok:

Hay varias diferencias entre su función y strtok.

  • Lo que su función no es simplemente eliminar los separadores de token
  • Sólo llama a su función una vez para procesar todas las partes de la cadena. Con strtok se llame varias veces para cada parte de la cadena (tiempos posteriores con NULL como el primer parámetro).
  • strtok también destruye la cadena de origen, mientras que el código utiliza su propia memoria intermedia (creo mejor usar su propio buffer como lo hizo).
  • tiendas strtok la posición de la siguiente contador después de cada llamada en el que el primer parámetro es NULL. Esta posición se utiliza para las llamadas subsiguientes. Esto no es hilo de seguridad y aunque su función sería hilo de seguridad.
  • strtok pueden utilizar múltiples delimitadores diferentes, mientras que el código utiliza sólo uno.

Una vez dicho esto, voy a dar sugerencias de cómo hacer una mejor función, no una función que está más cerca de aplicación de strtok.

Cómo mejorar su función (no emular strtok):

Creo que sería mejor hacer los siguientes cambios:

  • Haga que su función devuelva el token 'siguiente'
  • Salir de su bucle cuando se tiene * * origen o fuente == delimitador
  • Vuelta un puntero al primer carácter de la cadena de origen que contiene el siguiente token. Este puntero se puede utilizar para las llamadas subsiguientes.

Otros consejos

Este código no funciona en absoluto como strtok(). ¿Qué estaba tratando de hacer, exactamente? Pero en cuanto a las mejoras, el código tiene un error grave: si la longitud de source restado por el número de ocurrencias de token es mayor que la longitud de dest usted se tiene un muy clásico desbordamiento de pila , que parece algo irónico para mí en este momento. Esto no ocurrirá en el main que se ha utilizado, pero el uso de la función en otros lugares está obligado a llevar en el camino de la incertidumbre y el pantano de la desesperación.

strtok le permite iterar a través de todas las fichas. Para ello, suponiendo que la cadena de origen se puede escribir e insertar en él nulos en los descansos de tokens. El búfer de destino es un puntero al carácter de compensación en el canto del búfer de origen. Puede utilizar este hecho para saber cuando se ha llegado al final + también a mantener el "estado" de una llamada.

strtok no es una buena función de usar, ya que destruye la cadena de origen. Tampoco se re-entrante.

strtok (), se guardará un estado, por lo que se le puede llamar varias veces para obtener varias fichas. Además, () se "dividir" la cadena de origen para que pueda obtener múltiples cadenas de destino, siendo un símbolo strtok cada uno.

Todo el código hace, por lo que veo, es ignorar cualquier carbón de entrada que es igual al separador de token y continuar copiando a la nula-terminación de la fuente.

Edit: Además, consideran que hay dos secuenciación token-seperators: La primera será ignorada por su función, la segunda se escribirá en el destino, mientras que strtok () definirá una seqeunce de 2 o más delimitadores como una sola delimitador (página del manual: http://man.cx/?page=strtok )

strtok destruye la cadena de entrada con el carácter NUL, lo que hace que tipo de hostil.

Es necesario considerar también el caso de "XYZ ,, pdq" cuántas fichas se strtok retirarse de esa cadena si '' es el delimitador.

¿Qué desea que su función se puede hacer en este caso?

Además, strtok (...) es compatible con múltiples caracteres delimitadores. Mira en las definiciones de strspn (...) y strcspn (...), ya que pueden ser utilizados para re-implementar strtok (...).

Por cierto, long_name es puntero a char y sizeof (long_name) se sizeof (char *). no el tamaño de cuáles son los puntos a long_name.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top