Pergunta

Eu desenvolvi minha própria versão de strtok. Apenas para praticar o uso de ponteiros.

Alguém pode ver quaisquer limitações com este ou de qualquer maneira eu posso melhorar.

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;
}
Foi útil?

Solução

Uma nota lateral: A palavra 'símbolo' é geralmente usado para descrever as partes da cadeia que são devolvidos. Delimitador é usado para descrever a coisa que separa os tokens. Então, para tornar seu código mais claro que você deve renomear token para delimitador e renomear dest para token_dest.

As diferenças na sua função e strtok:

Existem várias diferenças entre a sua função e strtok.

  • O que a função não é simplesmente remover os separadores de token
  • Você só chamar sua função uma vez para processar todas as partes da cadeia. Com strtok você chamá-lo várias vezes para cada parte da cadeia de caracteres (tempos posteriores com NULL como o primeiro parâmetro).
  • strtok também destrói a cadeia de origem, enquanto que o código usa seu próprio buffer (eu acho melhor usar seu próprio tampão como você fez).
  • lojas strtok a posição do próximo token após cada chamada, onde o primeiro parâmetro é NULL. Esta posição é então usado para chamadas subseqüentes. Este não é o segmento que segura e sua função seria thread-safe.
  • strtok pode usar vários delimitadores diferentes, ao passo que seus usos de código apenas um.

Dito isto, vou dar sugestões de como fazer uma função melhor, não uma função que está mais perto de implementação do strtok.

Como melhorar a sua função (strtok não emular):

Eu acho que seria melhor fazer as seguintes alterações:

  • Tenha sua função simplesmente devolver o 'próximo' símbolo
  • Romper com o seu ciclo quando você tem fonte * ou fonte * == delimitador
  • retornar um ponteiro para o primeiro caractere da seqüência de origem que contém o próximo token. Este ponteiro pode ser usado para chamadas subseqüentes.

Outras dicas

Este código não funciona em todos como strtok(). O que você estava tentando fazer, exatamente? Mas, tanto quanto melhorias, seu código tem um bug sério: se o comprimento do source subtraído pelo número de ocorrências de token é maior do que o comprimento de dest você tem-se um muito clássico estouro de pilha , o que parece um tanto irônico para mim no momento. Isso não vai acontecer no main que você usou, mas usando a função em outra parte é obrigado a levá-lo para o caminho da incerteza e do desespero do desespero.

strtok permite percorrer todos os tokens. Ele faz isso assumindo que a cadeia de origem é gravável e inserindo valores nulos nele nas quebras de tokens. O buffer de destino é um ponteiro para o personagem compensar withing o buffer de origem. Você pode usar este fato para saber quando você chegou ao final + também manter o "estado" entre chamadas.

strtok não é uma boa função para uso, uma vez que destrói a cadeia de origem. Também não é re-entrantes.

strtok () irá poupar algum estado, para que você possa chamá-lo várias vezes para obter múltiplas tokens. Além disso, strtok () irá "split" da cadeia de origem para que você obtenha várias seqüências de destino, cada um sendo um token.

Todo o seu código faz, pelo que vejo, é ignorar qualquer caractere de entrada que é igual ao seperator forma, e continuar a copiar para o nulo de terminação da fonte.

edit: Além disso, considere há dois sequenciamento token-seperators: A primeira será ignorado pelo seu função, o segundo será escrito para o destino, enquanto que strtok () irá definir uma seqeunce de 2 ou mais delimitadores como um único delimitador (página man: http://man.cx/?page=strtok )

strtok destrói a cadeia de entrada com o caractere NUL, o que torna tipo de hostil.

Você precisa considerar também o caso de "xyz ,, pdq" quantas fichas vai strtok retirar dessa cadeia se '' é o delimitador.

O que você quer que sua função para fazer neste caso?

Além disso, strtok (...) suporta múltiplos caracteres delimitadores. Olhar para as definições de strspn (...) e strcspn (...), como eles podem ser usados ??para re-implementar strtok (...).

a propósito, é long_name ponteiro de carvão animal e sizeof (long_name) é sizeof (char *). não o tamanho do que os pontos long_name a.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top