En acceptant n'importe quel nombre d'entrées de la fonction scanf
Je suis en train de lire un nombre inconnu d'entrées à l'aide de scanf
fonction.
int a[100];
int i = 0;
while((scanf("%d", &a[i])) != '\n')
i++;
//Next part of the code
Mais cette fonction n'est pas d'aller à la prochaine partie du code, qui semble comme il y a une infinie while.
Comment puis-je résoudre cette erreur de logique? Est-il d'autres alternatives pour scanf
comme sscanf
de lire des entiers dans un tableau?
Comment voulez-vous de marquer la fin de l'entrée?
Supposons que l'utilisateur commence à entrer une liste de numéros de dire 10 espace 20 30 et après qu'ils ont fini d'entrer, ils doivent appuyer sur la touche enter pour sortir de la boucle
Valeur de retour de scanf est le <b>nombre d'éléments d'entrée correctement mis en correspondance</b>, et affecté, ce qui peut être moins que prévu, voire nul dans le cas d'un début de la correspondance de l'échec. De sorte que la comparaison avec
Parce que c'est
Supposons que l'utilisateur commence à entrer une liste de numéros de dire 10 espace 20 30 et après qu'ils ont fini d'entrer, ils doivent appuyer sur la touche enter pour sortir de la boucle
Valeur de retour de scanf est le <b>nombre d'éléments d'entrée correctement mis en correspondance</b>, et affecté, ce qui peut être moins que prévu, voire nul dans le cas d'un début de la correspondance de l'échec. De sorte que la comparaison avec
\\n
n'est pas correct.Parce que c'est
getchar
qui renvoie le caractère suivant à partir de stdin, pas scanf
n = scanf("%d%d ... %d", a+0, a+1, ..., a+99); printf("%d numbers\n", n);
OriginalL'auteur user2147954 | 2013-03-08
Vous devez vous connecter pour publier un commentaire.
scanf
renvoie le nombre d'éléments d'entrée qui ont été appariés et attribué, ainsi, il est raisonnable de le faire:Maintenant, vous voulez être en mesure de lire plusieurs numéros, chacun défini sur la nouvelle ligne. Ensuite, vous pouvez simplement faire ceci:
noter que cette lecture ne s'arrêtera que si l'entrée non valide est entré (par exemple lettre
q
) ou lors de la saisie de la fin de la saisie de code de contrôle, qui est Ctrl+Z (sur Windows) ou Ctrl+D (sur Mac, Linux, Unix).Notez que la fuite
\n
dans lescanf()
chaîne de format est une interface utilisateur catastrophe si les utilisateurs le type de l'entrée. L'entrée pour le premier numéro n'a pas de fin jusqu'à ce que vous tapez quelque chose (probablement le deuxième numéro) qui n'est pas un espace blanc. De plus, le retour à la ligne dans la chaîne de format correspond à tout espace blanc — espaces ou des tabulations ainsi que de nouvelles lignes; il catégoriquement ne demande pas un retour à la ligne. Et, dernier clou dans le cercueil pour le moment, la conversion numérique spécifications, comme la%d
sauter les (grands) espace blanc automatiquement. Seulement%c
,%[…]
(scan) et des%n
ne pas ignorer les espaces.Recommandation: supprimer le
\n
de la chaîne de format. Le code fonctionne mieux quand un homme est en train de taper. (Il ne sera pas évident pour l'utilisateur qu'il y a un problème car il n'y a pas de retour d'information entre les nombres d'entrées. Si vous vous en sortez dans cet exemple. Dans d'autres contextes, il y aurait des problèmes nécessitant l'utilisateur à être prémonitoire — sachant que pour entrer dans le prochain.)Voir Quel est l'effet d'une fin vide dans un scanf() format de chaîne de caractères?
OriginalL'auteur LihO
La valeur de retour de scanf est le nombre d'éléments d'entrée correctement mis en correspondance et attribué, alors essayez ceci pour mettre fin à quand une non-entrée numérique est produite:
Parce que la lecture se poursuit jusqu'à l'entrée non valide ou EOF est entré. Voir ma réponse.
OriginalL'auteur Klas Lindbäck
Tout d'abord remplacer
"%d"
par" %d"
cela permettra d'éviter de nouveaux problèmes liés à la lignedeuxième si votre entrée contenir de non entrée numérique alors votre alors que la boucle va entrer dans la boucle infinie. donc vous devez vérifier votre saisie si c'est une entrée numérique
OriginalL'auteur MOHAMED
La valeur de retour de scanf est le nombre de numérisées entrées par appel. Vous pouvez le comparer à l'entier 10 (ou '\n'), qui serait arrêter la boucle lorsque le scanf fait lire les 10 éléments. (Et pour ce faire, il devait avoir une dizaine de rédacteurs de devis dans la chaîne de format.
Vous pouvez essayer
Accepter n'importe quel nombre d'arguments doit être programmé, par exemple. comme
où
custom_scan_next_integer
modifie le pointeur p de transmettre la bonne quantité de caractères.OriginalL'auteur Aki Suihkonen
Vous voulez faire
continuer à bénéficier de l'entrée jusqu'à une nouvelle ligne.
scanf() n'est pas le meilleur outil pour la lecture des lignes entières. Vous devez utiliser fgets() pour lire la ligne, puis de l'analyser en utilisant sscanf() ou d'autres fonctions.
i < 100
...Ce travail? J'aimerais qu'il y ait un espace blanc entre tous les numéros.
OriginalL'auteur Avidan Borisov