À l'aide de la fonction scanf dans la boucle while
Je tente de formater un espace délimité par la saisie de l'utilisateur pour une programmation d'affectation.
Essentiellement, l'entrée se compose d'un nombre arbitraire d'expressions
L integer integer integer integer
et C integer integer integer
.
Par exemple: L 1 1 5 7 C 4 5 3
.
Jusqu'à présent, j'ai réussi à extraire les nombres entiers fonction sur le caractère initial, et peut parcourir la chaîne à l'aide de la fonction scanf:
char a;
while(scanf("%c", &a) == 1){
if(a == 'C'){
int inputX, inputY, inputR;
scanf("%d %d %d", &inputX, &inputY, &inputR);
printf("%d %d %d\n", inputX, inputY, inputR);
}
else if(a == 'L'){
int x1, y1, x2, y2;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
printf("%d %d %d %d\n", x1, y1, x2, y2);
}
}
Malheureusement, bien que ce sorties souhaité entiers, la boucle (et la saisie de l'utilisateur l'invite de commande) n'est pas arrêter.
Quelqu'un pourrait-il svp m'éclairer pourquoi ce qui se passe?
Vous nourrissez-vous un
l'alimentation d'une
EOF
(par Ctrl+D sous Linux ou Ctrl+Z dans Windows) à la fin de votre entrée?l'alimentation d'une
EOF
se termine à l'entrée alors que le programme est en cours d'exécution, mais je m'attends à mettre fin à Enter
.OriginalL'auteur Julian Laval | 2013-11-11
Vous devez vous connecter pour publier un commentaire.
C'est parce que
\n
est toujours là pour fairescanf("%c", &a) == 1
toujours vrai.Changer votre
à
Un espace avant
%c
va manger ce\n
laissés parscanf
(en appuyant sur Entrée).J'ai écrit un programme qui lit des caractères.
printf("\n 1. Give a character : \n");
scanf(""%c", &ch);
while(ch != '\0'){
...
printf("\n 2. Give a character : \n");
scanf("%c", &ch);
}
Mais l'exécution de ce programme, la deuxième printf est imprimé deux fois. Après avoir ajouté un espace avant%c
, il a fonctionné correctement! Pourriez-vous m'expliquer pourquoi nous avons besoin d'ajouter un spece avant%c
, de sorte que la deuxième printf est imprimé qu'une seule fois?La raison est simple qui je l'ai expliqué dans la réponse ci-dessus. Lorsque vous appuyez sur la touche "Entrée" puis un caractère de saut de ligne
\n
est d'aller à la mémoire tampon d'entrée. Sia
est le caractère d'entrée puis à l'entrée de la mémoire tampon contiendraa\n
. Premièrescanf
va lirea
laissant\n
dans le tampon pour le prochain appel descanf
. En entrant dans la boucle, votre deuxièmescanf
va lire ce les restes de\n
le tampon d'entrée et la boucle s'exécute une fois de plus sans attente de vos commentaires et c'est pourquoi vous obtenezGive a character
ligne deux fois.Un espace avant %c va manger ce
\n
(ou un nombre quelconque d'espaces) laissés parscanf
.OriginalL'auteur haccks
La raison en est scanf lit directement à partir de l'entrée standard et qui bloque et attend la saisie de l'utilisateur après qu'il a traité de la ligne. Ce que vous devez faire est de lire la ligne et le processus de cette ligne dans votre boucle while. J'ai modifié votre code ci-dessous.
OriginalL'auteur T.V.
La combinaison de certaines caractéristiques des autres posts et quelques ajouts.
Utilisation
fgets()
et%n
à l'intérieur desscanf()
. Assurez-vous de vérifier les résultats desscanf()
.OriginalL'auteur chux