Comment diviser une chaîne en jetons par '&' code> en C? p>
4 Réponses :
char *token; char *state; for (token = strtok_r(input, "&", &state); token != NULL; token = strtok_r(NULL, "&", &state)) { ... }
Je le ferais comme ça (en utilisant Strchr () < / code>
): strchr (const char * s, int c) code> retourne un pointeur sur l'emplacement suivant de
C < / code> dans
s code> ou
null code> si
c code> n'est pas trouvé dans
s code>. p> < P> Vous pourriez être en mesure d'utiliser
strtok () code>, mais je n'aime pas
strtok () code>, car: p>
"A && B & C" Code>, les jetons retournés sont
"A" code> ", et
"C" code>. Notez qu'il n'y a pas de jeton vide après
"a" code>. Li>
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 () code> fait i> 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 code> a i> 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 i>. C'est très explicite. OpenGroup.org/onlinePubs/009695399/fonctions/strtok.html . Pouvez-vous poster le code où
strtok () code> 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 & code>. Par exemple, comment pouvez-vous obtenir le premier jeton,
ce code>, par lui-même.
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]);
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;
}
Stackoverflow.com/Questtions/266357/Tokenizing-strings-in-c < / a>
On dirait que cette question est de scinder une chaîne littérale (bien que la question soit faible sur les détails, disant «ne fonctionne pas»). Cela peut être ou peut ne pas être ce que veut l'OP. Nous devrions lui donner une chance d'expliquer cela. La chaîne est-elle divisée une chaîne littérale ou est-ce que c'est en lecture seule?