4 Réponses :


13
votes

strok / strtok_r

char *token;
char *state;

for (token = strtok_r(input, "&", &state);
     token != NULL;
     token = strtok_r(NULL, "&", &state))
{
    ...
}


0 commentaires

9
votes

Je le ferais comme ça (en utilisant Strchr () < / code> ): xxx

strchr (const char * s, int c) retourne un pointeur sur l'emplacement suivant de C < / code> dans s ou null si c n'est pas trouvé dans s . < P> Vous pourriez être en mesure d'utiliser strtok () , mais je n'aime pas strtok () , car:

  • Il modifie la chaîne étant tokenized, de sorte qu'il ne fonctionne pas pour les chaînes littérales ou n'est pas très utile lorsque vous souhaitez conserver la chaîne à d'autres fins. Dans ce cas, vous devez copier la chaîne vers une première temporaire.
  • Il fusionne des délimiteurs adjacents, donc si votre chaîne était "A && B & C" , les jetons retournés sont "A" ", et "C" . Notez qu'il n'y a pas de jeton vide après "a" .
  • Ce n'est pas le fil-coffre-fort.

5 commentaires

Je suppose que cela dépend aussi de la mise en œuvre C. Sur mon système, la chaîne elle-même n'est pas modifiée lorsque j'appelle Strtok (). En fait, je ne vois même pas comment cela pourrait. Après tout, il suffit de produire des pointeurs au début des différents jetons de la chaîne.


Ceees Meijer: strtok () fait modifie la chaîne d'arguments - les caractères de délimitation sont remplacés par '\ 0', de sorte que les chaînes retournées sont correctement terminées.


strtok a pour modifier la chaîne si elle doit être conforme aux normes. À partir de la norme C: Si un tel caractère est trouvé, il est écrasé par un caractère nul, qui termine le jeton actuel . C'est très explicite. OpenGroup.org/onlinePubs/009695399/fonctions/strtok.html . Pouvez-vous poster le code où strtok () ne modifie pas la chaîne?


Oups. Je suppose que tu dois avoir raison. Mon erreur. En effet, la modification du délimiteur en \ 0 est la seule façon de fonctionner. Et après un examen plus étroit de mon code (c'est un système intégré, alors inspecter le code désassemblé n'était pas si difficile) je vois que c'est exactement ce qui se passe.


Je ne comprends pas comment cela va diviser la chaîne par & . Par exemple, comment pouvez-vous obtenir le premier jeton, ce , par lui-même.



2
votes

Vous pouvez utiliser la fonction Strok () comme indiqué dans l'exemple ci-dessous.

/// Function to parse a string in separate tokens 

int parse_string(char pInputString[MAX_STRING_LENGTH],char *Delimiter,
                   char *pToken[MAX_TOKENS])
{
  int i;
  i = 0;

  pToken[i] = strtok(pInputString, Delimiter);
  i++;

  while ((pToken[i] = strtok(NULL, Delimiter)) != NULL){
     i++;
  }
  return i;
}

/// The array pTokens[] now contains the pointers to the start of each token in the (unchanged) original string.

sprintf(String,"Token1&Token2");
NrOfParameters = parse_string(String,"&",pTokens);

sprintf("%s, %s",pToken[0],pToken[1]);


0 commentaires

0
votes

Pour moi, en utilisant strtok () code> La fonction est intuitive et trop compliquée, alors j'ai réussi à créer mon propre unique. En tant qu'arguments, il accepte une chaîne à scinder, le caractère qui déterminait les espaces entre jetons et pointeur représentant le nombre de jetons trouvés (utile lors de l'impression de ces jetons en boucle). Un inconvénient de cette fonction est fixe une longueur maximale de chaque jeton.

#include <stdlib.h>
#include <string.h>
#define MAX_WORD_LEN 32


char **txtspt(const char *text, char split_char, int *w_count)
{
    if(strlen(text) <= 1) 
        return NULL;

    char **cpy0 = NULL;
    int i, j = 0, k = 0, words = 1;

    //Words counting
    for(i = 0; i < strlen(text); ++i)
    {
        if(text[i] == split_char && text[i + 1] != '\0')
        {
            ++words;
        }
    }
    //Memory reservation
    cpy0 = (char **) malloc(strlen(text) * words);
    for(i = 0; i < words; ++i)
    {
        cpy0[i] = (char *) malloc(MAX_WORD_LEN);
    }

    //Splitting
    for(i = 0; i < strlen(text) + 1; ++i)
    {
       if(text[i] == split_char)
       {
           cpy0[k++][j] = '\0';
           j = 0;
       }
       else
       {
           if(text[i] != '\n')           //Helpful, when using fgets() 
                cpy0[k][j++] = text[i];  //function
       }

    }

    *w_count = words;
    return cpy0;
}


0 commentaires