J'essaie de goverser une chaîne mais j'ai besoin de savoir exactement quand aucune donnée n'est vue entre deux jetons. par exemple, lors de la jouvre de la chaîne suivante " a, b, c , d, e code>" J'ai besoin de savoir sur les deux emplacements vides entre '
d code>' et ' E code> '... que je suis incapable de savoir simplement en utilisant
strtok () code>. Ma tentative est présentée ci-dessous:
char arr_fields[num_of_fields];
char delim[]=",\n";
char *tok;
tok=strtok(line,delim);//line contains the data
for(i=0;i<num_of_fields;i++,tok=strtok(NULL,delim))
{
if(tok)
sprintf(arr_fields[i], "%s", tok);
else
sprintf(arr_fields[i], "%s", "-");
}
6 Réponses :
Vous ne pouvez pas utiliser une séquence de deux caractères de délimitation ou plus contigus dans les analyses analysées
La chaîne est considérée comme un seul délimiteur. Personniers de délimiteur à
Le début ou la fin de la chaîne sont ignorés. Mettre un autre moyen: le
Les jetons retournés par strtok () sont toujours des cordes non émises. P>
blockQuote>
Par conséquent, il suffit de sauter de Vous allez avoir à analyser la chaîne manuellement ou peut-être de rechercher une bibliothèque d'analyse de la CSV qui faciliterait votre vie. P> strtok () code> si c'est ce que vous voulez. De la page man: p>
C code> à
d code> dans votre exemple. p>
Vous pouvez essayer d'utiliser strchr code> pour trouver les emplacements des symboles
, code>. TOKENISER manuellement votre chaîne jusqu'à la jeton que vous avez trouvée (en utilisant
memcpy code> ou
strncpy code>), puis utilisez à nouveau Strchr. Vous serez en mesure de voir si deux ou plusieurs virgules sont à côté de l'autre de cette manière (Strchr retournera des chiffres que leur soustraction sera égale à 1) et vous pouvez écrire un
si code> instruction pour gérer ce cas. < / p>
Étant donné que les délimiteurs peuvent être des virgules ou une nouvelle ligne, strchr () code> n'est pas l'outil approprié à utiliser.
ne peut pas Strchr () localiser la valeur '\ n'?
Oui, strchr () code> peut trouver des virgules et trouver des nouvelles lignes, mais de trouver la prochaine "virgule ou nouvelle ligne", vous devez appeler
strchr () code> deux fois, une fois que Rechercher la virgule, une fois pour la nouvelle ligne.
Vous ne pouvez pas utiliser une déclaration «cas»? Je pense que ce n'est pas l'outil le plus approprié à utiliser, mais cela peut résoudre le problème d'accord.
Il existe d'autres fonctions de chaîne - strgespn () code>,
strcspn () code>,
STRPBRK () code> en particulier - qui fait la majeure partie du travail nécessaire. Oui, je suis sûr que vous pourriez l'écrire à l'aide d'une déclaration
code>, mais ce n'est pas ce qui vous dérange.
+1 Parce que vous avez raison :) J'ai toujours tendance à utiliser l'outil le plus simpliste et à construire à la main pour essayer de le faire fonctionner comme je le veux. Ceci, évidemment, me donne beaucoup de problèmes ...
La norme indique ce qui suit concernant [# 3] Le premier appel de la séquence recherche la chaîne
pointé vers par Dans la citation ci-dessus, nous pouvons lire que vous ne pouvez pas utiliser Vous pouvez facilement mettre en œuvre votre propre Version de si aucun caractère de correspondance n'est trouvé que la fonction renvoie null. p> Utilisation de l'échantillon strong> p> sortie strong>
p> strtok code>: p>
s1 code> pour le premier caractère qui n'est pas
contenue dans la chaîne de séparateur actuelle pointée par
S2 code>.
Si aucun caractère de ce type n'est trouvé, il n'y a pas de jetons dans
La chaîne pointée par
S1 code> et la fonction de fonction code> strutok code>
un pointeur nul. Si un tel caractère est trouvé, c'est le
début du premier jeton. p>
BlockQuote>
strtok code> comme solution à votre problème spécifique, car il traitera des caractères séquentiels trouvés dans
Delims code> En tant que
Suis-je condamné à pleurer en silence, ou quelqu'un peut-il m'aider? h3>
strtok code> qui fait ce que vous voulez, voir les extraits à la fin de ce message. p>
strtok_single code> utilise
STRPBRK (Char const * src, const char * delims) code> qui retournera un pointeur à la première occurrence de tout caractère dans Delims em> qui se trouve dans la chaîne NULL terminée src em >. p>
@Jonathanleffler C'est un exemple simple de mise en œuvre suivant les règles énoncées par strtok code> mais qui confirme à quel point souhaite. Oui,
Strtok CODE> n'est pas thread-coffre-fort, bien que ce soit une question complètement différente de ce que demande.
@Jonathanleffler Je n'ai jamais rien dit pour contredire ce que vous dites, je suis bien conscient des pièges qui apparaissent (ou de bas) lors de l'utilisation de strtok code>.
@ Philiprosénéen-refudorez-moi une question sur l'une de vos réponses. Pouvez-vous s'il vous plaît voir Stackoverflow.com/Questtions/30294129/...
Notez que cette version de strtok_single () code> ne renvoie pas le segment après le dernier délimiteur. Il y a une version fixe dans ce Réponse , ainsi que le code de démonstration du problème.
@Christophequintard bien repéré, je pense que cette solution particulière s'est perdue dans une révision historique (elle a été réparée, Voir Historique ) .
@Jonathanleffler Je viens de remarquer que vous avez fourni une solution pour le bogue adressé par @christophequintard , bien que fonctionnel, je pense que vous êtes Intéressé à mon correctif que je viens de modifier.
Cela ressemble à peu près à l'équivalent, bien que différent en détail. Les résultats ont l'air identiques, ce qui est bon. (Je ne peux que uppoter une fois - vous l'avez déjà eu - parce que «Écrivez le vôtre si l'outil standard ne fait pas le travail» Le conseil est entièrement valide, bien qu'il soit utilisé avec prudence. Vous devez vous assurer qu'il n'y a pas de Un outil standard alternatif que vous pouvez utiliser à la place avant de réinventer la roue.)
Comme mentionné dans Cette réponse , vous voudrez implémenter quelque chose comme strtok code> vous-même . Je préfère utiliser
strcspn code> (par opposition à
strpbrk code>), car il permet moins
si code> instructions:
Dernièrement, je cherchais une solution au même problème et j'ai trouvé ce fil. P>
Vous pouvez utiliser La fonction StrSeP () a été introduite en remplacement de Strtok (3),
Comme ce dernier ne peut pas gérer les champs vides. P>
blockQuote> strgesp () code>.
Du manuel: p>
@DHAIVATPANDYA: Ce n'est pas un avis très utile à moins que cela soit accompagné d'une raison ...
Vous voulez dire "entre" C "et" D ""?
C'est des conseils extrêmement précis. Le problème est que
strtok () code> est conçu pour ignorer les répétitions des caractères de séparateur de jeton et cela les oblitère. Par conséquent, si vous devez connaître des séparateurs de jetons adjacents ou si vous devez savoir quel séparateur a marqué la fin d'un jeton, vous ne pouvez pas utiliser
strtok () code> pour le travail.