La segmentation des chaînes en C
J'ai essayé de marquer une chaîne de caractères en utilisant l'ESPACE comme délimiteur, mais il ne fonctionne pas. Ce que quelqu'un a une suggestion sur pourquoi ça ne marche pas?
Edit: la segmentation à l'aide de:
strtok(string, " ");
Le code est comme suit
pch = strtok (str," ");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ");
}
- Êtes-vous à l'aide de strtok ou quelque chose que vous avez grandi vous-même? cplusplus.com/reference/clibrary/cstring/strtok.html Si vous utilisez strtok êtes-vous essayer de le faire sur une chaîne constante?
- votre exemple obtenir le premier jeton, regardez soit gbjbaanb ou mes réponses pour une utilisation correcte.
- OK. Maintenant que nous obtenons quelque part. Ce comportement pensez-vous que vous n'obtenez pas?
- Votre code est correct, s'il vous plaît laissez-nous savoir ce que votre chaîne d'entrée et le résultat est.
- BTW, kombo. Beaucoup de gens qui travaillent à l'aide d'un bureau ou d'enseigner à voir la phrase "ça ne fonctionne pas" comme marquant un utilisateur qui n'a pas lu la remise d'un manuel, ou ne savent pas ce qu'ils veulent réellement, ou est profondément troublé. La forme que vous voulez, c'est "je fais X, et je m'attendais à Y, mais j'ai eu Z. Quel est le problème?"
- bon point. Canonique x-ref: catb.org/~esr/faqs/smart-questions.html
Vous devez vous connecter pour publier un commentaire.
De faire comme ceci:
Remarque:
strtok
modifie la chaîne de ses tokenising, de sorte qu'il ne peut pas être unconst char*
.Voici un exemple de
strtok
d'utilisation, gardez à l'esprit questrtok
est destructeur de sa chaîne d'entrée (et donc ne peut pas jamais être utilisé sur une chaîne constanteFondamentalement, la chose à noter est que le passage d'un
NULL
comme premier paramètre destrtok
dit-il pour obtenir le prochain jeton de la chaîne, il était déjà à la segmentation.strtok()
le savez, lors de la prochaine jeton de la chaîne, il était déjà à la segmentation? Pour moi, ça ressemble àstrtok()
devrait marquer leNULL
valeur. Je m'attends à une erreur.strtok
a un état interne de la variable suivi de la chaîne sous forme de jeton. Lorsque vous passezNULL
à elle,strtok
continuera d'utiliser cette variable d'état. Lorsque vous transmettez une valeur non nulle, la variable d'état est réinitialisé. Donc, en d'autres mots: en passantNULL
signifie "continuer à la segmentation de la même chaîne".strtok_r
qui atr le moins offre un moyen de l'utiliser dans un thread de façon sécuritaire.char *p
être alloué de l'espace en premier? D'où vient le pointeur retourné par strtok point? Juste un endroit aléatoire dans la mémoire? Oh... est-ce point à un endroit dans la chaîne?strtok
remplace le délimiteur trouvé avec un'\0'
caractère de sorte quep
seront effectivement valideNUL
chaîne terminée. Donc, si vous exécutez surchar[] s = "hello world";
Le premier appel serait de retourner un pointeur vers lah
caractère et de la zone tampon de contenir"hello\0world"
.strtok peut être très dangereux. Il n'est pas thread-safe. Son utilisation prévue est d'être appelée dans une boucle, en passant dans la sortie de l'appel précédent. La fonction strtok a une variable interne qui stocke l'état de la strtok appel. Cet état n'est pas unique à chaque thread - il est global. Si un autre code utilise strtok dans un autre thread, vous avez des problèmes. Pas le genre de problèmes que vous souhaitez suivre en bas de chaque!
Je recommande la recherche d'une expression régulière de la mise en œuvre, ou d'utiliser sscanf de séparer la chaîne.
Essayez ceci:
Remarque: Le "texte" de la chaîne est détruit comme il est séparé. Cela peut ne pas être le comportement préférée =)
Vous pouvez simplifier le code, en introduisant une variable supplémentaire.
J'ai fait quelques fonctions de chaîne afin de partager des valeurs, en utilisant moins de pointeurs que j'ai pu parce que ce code est destiné à s'exécuter sur PIC18F processeurs. Ces processeurs ne gère pas vraiment bon avec des pointeurs lorsque vous avez peu de RAM disponible:
Lors de la lecture de la strtok de la documentation, je vois que vous besoin de passer par un pointeur NULL après le premier "initialisation de l'appel". Peut-être que vous n'avez pas le faire. Juste une supposition, bien sûr.
Voici un autre
strtok()
mise en œuvre, qui a la capacité de reconnaître consécutives délimiteurs (bibliothèque standard dustrtok()
n'ont pas cette)La fonction est une partie de BSD licence de la bibliothèque string, appelé zString.. Vous êtes plus que bienvenus pour contribuer 🙂
https://github.com/fnoyanisi/zString
Comme mentionné dans les messages précédents, depuis
strtok()
, ou celui que j'ai mises en œuvre ci-dessus, repose sur unestatic *char
variable afin de préserver l'emplacement du dernier délimiteur entre les appels consécutifs, des précautions supplémentaires doivent être prises, tout en traitant avec des multi-thread demandes.}
Vous pouvez lire le détail de l'analyse sur le blog mentionné dans mon profil 🙂