Utiliser scanf avec des Expressions Régulières
J'ai essayé d'utiliser des expressions régulières sur le scanf pour lire une chaîne de n caractères et jetez rien d'autre jusqu'à ce que le Caractère de Nouvelle Ligne. Les espaces doivent être traités comme des caractères normaux, ainsi inclus dans la chaîne de caractères à lire.
J'ai étudié un article de Wikipédia sur les Expressions Régulières, mais je ne peux pas obtenir scanf pour fonctionner correctement. Voici un code que j'ai essayé:
scanf("[ ]*%ns[ ]*[\n]", string);
[ ] est censé aller pour le véritable caractère d'espace, * est censé signifier un ou plus, n est le nombre de caractères à lire et à chaîne est un pointeur alloué avec malloc.
J'ai essayé plusieurs combinaisons différentes; cependant, j'ai tendance à obtenir que le premier mot d'une phrase comme suit: (s'arrête à caractère espace). En outre, * semble jeter un caractère au lieu de la signification "zéro ou plus"...
Quelqu'un pourrait-il expliquer en détail comment les expressions régulières sont interprétés par le scanf? Ce qui est plus, il est efficace d'utiliser la fonction getc de façon répétitive à la place?
Merci d'Avance 😀
- Essayez
fgets()
:fgets(string, sizeof string, stdin);
- Le problème est que tous les caractères restants seront laissés dans le flux d'entrée, n'est-ce pas?
- Si il y a assez d'espace
fgets()
consomme tout jusqu'à (et y compris) un'\n'
. - Ne pas utiliser scanf.
Vous devez vous connecter pour publier un commentaire.
La réponse courte:
scanf
ne pas manipuler les expressions régulières littéralement parlant.Si vous souhaitez utiliser les expressions régulières en C, vous pouvez utiliser les regex POSIX bibliothèque. Voir la question suivante d'un exemple de base sur cette utilisation de la bibliothèque : Les expressions régulières en C: exemples?
Maintenant, si vous voulez le faire de la
scanf
façon, vous pouvez essayer quelque chose commeRemplacer le
n
dans%ns
par le nombre maximal de caractères à lire à partir du flux d'entrée.Le
%*[ ]
partie demande à ignorer les espaces. Vous pouvez remplacer le*
par un nombre spécifique d'ignorer un nombre précis de caractères. Vous pouvez ajouter d'autres caractères entre des accolades à ignorer plus que juste des espaces.Ne sais pas si le ci-dessus scanf travail comme des espaces sont également jumelés avec le
%s
directive.Je serais certainement aller avec un
fgets
appel, puis triming les environs des espaces avec quelque chose comme ce qui suit: Comment puis-je découper avant/après les espaces dans un façon standard?fscanf(fp,"%*nameserver:%20[^\n]",address);
qui renvoie 0 (aucun résultat ne fonde); Etaddress
est vide. (Oui le fichier a été ouvert avec succès avant avec fopen).Dépend quelque peu sur l'application, mais OUI, répété
getc()
est efficace.à moins que j'ai lu la question mal, %[^'\n']s permet d'enregistrer le tout jusqu'à ce que le retour chariot est rencontré.
s
dans%[^'\n']s
n'est pas nécessaire.