2013-02-27 3 views
1
scanf("%s %d %s %d",word1,&num1,word2,&num2); 

alors lorsque l'utilisateur entre "quitter", il est supposé cesser de demander les 3 autres entrées. Cependant, il me demande d'entrer un autre "quitter" probablement parce qu'il ya 2% s dans le formatComment faire scanf() avec plusieurs entrées ignorer les autres?

est-il de toute façon autour de cela? EDIT: car il doit avoir 4 entrées dans une boucle, sauf si un exit est entré.

+0

Vous pourriez avoir une analyse d'entrée plus fantaisie. Peut-être pourriez-vous utiliser 'flex' +' bison', ou 'antlr'? –

+2

@BasileStarynkevitch On peut comprendre pourquoi vous proposez d'écrire un analyseur LALR complet pour une entrée d'utilisateur de 4 mots seulement quand on voit votre profil et découvre que vous êtes un pirate de base GCC: P –

+0

On n'a pas dit qu'il n'y a que 4 différents mots .... –

Répondre

3

scanf est un outil très émoussé qui est pas bon parler aux entrées non structurées (y compris les humains :-)). En général, si vous interagissez avec une personne, vous devez commencer par fgets pour lire une ligne, puis sélectionner la ligne résultante, mais il est plus pratique, y compris éventuellement sscanf.

C'est pire que vous ne le pensez, car la directive %d va se bloquer si vous lui alimentez quelque chose qui n'est pas numérisable en entier. Par exemple, si vous entrez quit now, la première directive %s lira le mot quit mais %d laissera now dans le flux d'entrée, entraînant scanf pour renvoyer 1 (une conversion-et-affectation réussie). La prochaine tentative de lecture d'une chaîne obtiendra et consommera le now; Pour le code naïf, il semblerait que c'était une deuxième ligne d'entrée plus tard, plutôt qu'une continuation du premier.

+1

+1 pour mentionner que 'scanf()' ne fonctionne pas comme nous le pensons. Peut-être pourriez-vous suggérer une alternative, 'fgets()', par exemple. –

+1

@ H2CO3: la deuxième ligne suggère de commencer par 'fgets'. :-) – torek

2
#include <stdio.h> 
#include <string.h> 

scanf("%s ", word1); 
if (strcmp(word1, "quit") != 0) 
    scanf("%d %s %d", &num1, word2, &num2); 
Questions connexes