7
votes

Échappement de support carré] dans SSCANF

Je veux numériser des lignes comme xxx

J'ai écrit un petit programme pour le tester: xxx

compiler cela donne xxx

et la sortie xxx

si je le change en xxx

Je n'obtiens pas de plaintes de compilateur mais toujours xxx

Je sais que le problème est dans le deuxième jeton car xxx

donne < / p> xxx

mais je veux utiliser une condition de terminaison pour le deuxième jeton. Comment puis-je faire ça?


0 commentaires

5 Réponses :


-2
votes

pouvez-vous essayer xxx


1 commentaires

-1 ne fonctionnera pas - % s correspond à tout jusqu'à la prochaine utilisation de WhitSpace, il absorbera donc le caractère de ponctuation suivant (, ou ] ) Et le match ultérieur échouera.



5
votes

Comme d'autres personnes ont mentionné ... Je ne sais pas exactement ce que vous voulez faire ici ...

En supposant que les objets entre les crochets soient toujours des entiers, vous pouvez simplement faire: P>

sscanf(line, "[%[^,], %[^]]] => %d", a1, a2, &i);


0 commentaires

0
votes

Cela me semble un bug de compilateur (ou réellement, de bibliothèque) (bien que vous ayez besoin d'un troisième support droit, pas seulement deux). Selon la norme (C99, § 7.19.6.2): ​​

Si le spécificateur de conversion commence par [] ou [^], le caractère de support droit est dans la liste de numérisation et le caractère suivant droit suivant est le support droit correspondant qui met fin à la spécification;


0 commentaires

12
votes

Vous voulez

sscanf(line, "[%[^,], %[^]]] => %i", a1, a2, &i);


0 commentaires

3
votes

On dirait que votre question se résume essentiellement à "Comment inclure le caractère ] dans un scanne scanset". C'est possible et vous n'avez pas besoin de vous échapper. Spécifiquement, la spécification linguistique indique que lorsque le caractère ] suit immédiatement le caractère d'ouverture [ ou suit immédiatement l'ouverture ^ . Code>] est considéré comme une partie de la scanule, pas un support de fermeture. Donc, dans votre cas, le spécificateur de format est censé regarder comme "[% [^,],% [^]]]] =>% i" . Non \ nécessaire.

Je vois que vous avez presque compris cela, sauf que vous avez oublié le troisième ] de caractère après le second scanset.


0 commentaires