La lecture de plusieurs lignes de saisie avec scanf()
Pertinentes extrait de code:
char input [1024];
printf("Enter text. Press enter on blank line to exit.\n");
scanf("%[^\n]", input);
Qui va lire l'ensemble de la ligne jusqu'à ce que l'utilisateur appuie sur [enter], empêchant l'utilisateur d'entrer une deuxième ligne (si ils le souhaitent).
À la sortie, ils frapper [enter], puis [entrée]. Alors, j'ai essayé toutes sortes de boucles while, pour les boucles, et si les déclarations autour de la scanf() participation de la nouvelle ligne de la séquence d'échappement, mais rien ne semble fonctionner.
Des idées?
scanf()
est difficile à utiliser, surtout pour ce. Utilisation fgets()
au lieu de cela, il va être beaucoup plus simple.S'il vous plaît ne pas mentionner
gets
comme si c'était une bonne option pour quoi que ce soit. C'est trop dangereux (et heureusement finalement retiré de la langue).C'est une école de chose. Nous n'avons jamais appris
fgets()
. Les instructions dire, à lire dans l'ensemble des lignes de texte, et alors que nous devrons utiliser scanf()
à lire une ligne entière.Passé sous silence 🙂 je suis d'accord, mais n'étais pas au courant qu'il avait été supprimé. Merci!
Il n'a pas d'importance si vous avez "appris"
fgets()
ou pas. La façon de lire en entier les lignes de texte consiste à utiliser fgets()
.
OriginalL'auteur user688604 | 2012-11-27
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Cela semble fonctionner. Pouvez-vous expliquer un peu? Ce n' %*c de faire et pourquoi faut-il tout égal à 1?
Mais alors, il ne fonctionne plus, puisque le personnage mangé pourrait être le dernier caractère d'une ligne. user688604: %*c mange un personnage. scanf renvoie le nombre d'arguments, il rempli avant qu'il fini ou pas. Il ne pourra pas correspondre %[^\n] si le premier caractère qu'il voit, c'est un retour à la ligne. Une fois qu'il échoue, le prochain caractère à lire depuis l'entrée standard stdin sera un retour à la ligne.
Sûr qu'il fonctionne (je l'ai juste testé). Le seul problème potentiel est que si l'utilisateur entre plus de caractères que la mémoire tampon d'entrée peut contenir, la boucle va se terminer. Mais c'est un ensemble beaucoup préférable qu'un dépassement de la mémoire tampon. Dans cet exemple, le spécificateur de format doit être "%1023[^\n]%*c".
C'est ce que j'ai dit: "Le seul problème potentiel est que si l'utilisateur entre plus de caractères que la mémoire tampon d'entrée peut contenir, la boucle va se terminer." J'ai donc testé parfaitement bien. Je préfère simplement gérer l'erreur de trop grande entrée, plutôt que d'essayer de forcer ma tampons de données de résider dans des endroits spéciaux dans la mémoire.
OriginalL'auteur tmyklebu
Comme l'a encore souligné,
fgets()
est mieux ici quescanf()
.Vous pouvez lire une ligne entière avec
fgets(input, 1024, stdin);
où
stdin
est le fichier associé à la entrée standard (clavier).La fonction
fgets()
lit tous les caractères à partir du clavier jusqu'au premier caractère de nouvelle ligne: '\n' (obtenu après pressage ENTRER clé, bien sûr...).Important: Le caractère '\n' fera partie de la matrice de entrée.
Maintenant, votre prochaine étape est de vérifier si tous les caractères dans le tableau entrée,
de la première à la '\n', sont des blancs.
En outre, notez que tous les caractères après le premier '\n' dans entrée sont des ordures, de sorte que vous n'avez pas à vérifier.
Votre programme pourrait être comme suit:
Que le code doit être écrit à l'intérieur de votre
main()
bloc, et d'plus important encore, il est nécessaire d'inclure l'en-tête
<ctype.h>
avant tout,parce que le
isspace()
fonction est utilisée.Le code est simple: le tout est exécuté pour toujours, l'utilisateur d'entrer une ligne à chaque itération, la si phrases vérifie si une erreur s'est passé.
Si tout allait bien, puis un for(;;) instruction est exécutée, qui explore le tableau entrée pour regarder si il y a juste des blancs là... ou pas.
Le pour itérations de continuer jusqu'à la première nouvelle de ligne '\n' est trouvé, ou bien, un caractère non blanc apparaît.
Lorsque pour se termine, cela signifie que la dernière analysé le caractère, qui est tenu à
*s
, est un retour à la ligne (ce qui signifie que tous les personnages étaient des blancs), ou pas (ce qui signifie qu'au moins, il est certain caractère non-blanc dans input[], donc entrée est un texte normal).scanf()
votre code ne gère pas les flèches et la suppression.OriginalL'auteur pablo1977
OP dit "À la sortie, ils frapper [enter], puis [entrée]"
OriginalL'auteur chux
OriginalL'auteur Farhad Hossain
Il semble que vous avez essayé tout ce que vous ne devriez pas avoir essayé avant lecture! Un programmeur C est devrait à lire les manuels de peur qu'ils veulent exécuter en comportement indéfini qui provoque des maux de tête comme l'un que vous avez connu. D'élaborer, vous ne pouvez pas apprendre C par deviner comme vous pouvez Java.
Considérez cela comme votre leçon. Arrêter deviner et démarrer lire (le
fscanf
manuel)!Selon ce manuel:
L'emphase est mienne. Ce que vous semblez être décrit est un vide séquence d'octets, ce qui signifie que le match échoue. Quel est le manuel de dire à propos de correspondant échecs?
Encore, l'accent est à moi... C'est vous dire que comme la plupart des autres C-fonctions standard, vous devez vérifier la valeur de retour! Par exemple, lorsque vous appelez
fopen
vous écrire quelques idiome le long des lignes deif (fp == NULL) { /* handle error */}
.Où est votre erreur de manipulation? Notez que le valeur de retour n'est pas seulement un binaires de sélection; où
n
conversions sont effectuées, il y an+2
valeurs de retour possibles dans la gamme de:EOF
,0 .. n
. Vous devez comprendre ce que chacun de ces moyens, avant vous essayez d'utiliserfscanf
.OriginalL'auteur autistic
vous pouvez utiliser la suite funtion quand u veut lire l'entrée de la ligne suivante.
dans le cas où vous fournir en entrée de ligne de commande, il faudra encore un inout après changement de ligne.
OriginalL'auteur user2068378