scanf regex - C
J'avais besoin de lire une chaîne de caractères jusqu'à ce que la séquence ci-dessous est écrit: \nx\n :
(.....)\n
x\n
\n est le caractère de nouvelle ligne et (.....) peut être tous les caractères qui peuvent inclure d'autres caractères \n.
scanf permet d'expressions régulières pour autant que je sais, mais je ne peux pas le faire pour lire une chaîne de caractères jusqu'à ce schéma. Pouvez-vous m'aider avec le scanf chaîne de format?
J'ai essayé quelque chose comme:
char input[50000];
scanf(" %[^(\nx\n)]", input);
mais ça ne fonctionne pas.
OriginalL'auteur pasadinhas | 2013-03-27
Vous devez vous connecter pour publier un commentaire.
Malheureusement, il ne permet pas d'expressions régulières: la syntaxe est de prêter à proximité, mais il n'y a rien, même à distance similaire à l'expression régulière dans la mise en œuvre de
scanf
. Tout ce qui est là est un support pour les classes de caractères de regex, donc%[<something>]
est traitée implicitement comme[<something>]*
. C'est pourquoi votre appel descanf
se traduit par lire une chaîne composée des caractères autres que des'(', ')', 'x', and '\n'
.Pour résoudre votre problème à portée de main, vous pouvez créer une boucle pour lire l'entrée caractère par caractère. Chaque fois que vous obtenez une
'\n'
, vérifiez que'\n'
est un'x'
, et'x'
est un autre'\n'
Si tout ce qui précède est vrai, vous avez atteint la fin de votre prévus séquence d'entrée; sinon, la boucle devrait continuer.
OriginalL'auteur dasblinkenlight
scanf
ne pas des expressions régulières. Il a un support limité pour les classes de caractères, mais ce n'est pas du tout la même chose.Ne jamais utiliser
scanf
,fscanf
, ousscanf
, parce que:%s
) sont dangereux lorsqu'ils sont exactement de la même manièregets
est dangereux, c'est à dire qu'ils vont gaiement écrire après la fin de la mémoire tampon et le plantage de votre programme.Vous n'avez pas besoin d'expressions régulières pour ce cas; lire une ligne à la fois avec
getline
et s'arrête lorsque la lecture est "x". Toutefois, la norme (pas ISO C, mais POSIX) expression régulière routines de la bibliothèque sont appelésregcomp
etregexec
.Et même sans UB, je suis d'accord avec le point 3: récupérer à partir de la correspondance des échecs est souvent difficile.
Remarque: le Problème n ° 2 peut être évité en utilisant un modificateur de longueur.
En général, je pense que, si vous avez à prendre un supplément facultatif, étapes de éviter se tirer une balle dans le pied, c'est un mal conçu API.
OriginalL'auteur zwol