2013-03-08 2 views
4

J'essaie de lire un nombre inconnu d'entrées en utilisant la fonction scanf.Accepter un nombre quelconque d'entrées de la fonction scanf

int a[100]; 
int i = 0; 

while((scanf("%d", &a[i])) != '\n') 
i++; 

// Next part of the code 

Mais cette fonction ne va pas à la prochaine partie du code, il semble qu'il y ait une boucle while infinie.

Comment résoudre cette erreur logique? Existe-t-il d'autres alternatives à scanf comme sscanf pour lire des entiers dans un tableau?

+0

Comment voulez-vous marquer la fin de l'entrée? –

+0

Supposons que l'utilisateur commence à entrer une liste de nombres disons 10 espace 20 espace 30 et après qu'ils ont fini d'entrer ils doivent appuyer sur la touche entrée pour sortir de la boucle – user2147954

+0

Valeur de retour de scanf est le nombre d'éléments d'entrée correspondant et attribué , qui peut être inférieur à ce qui est prévu, voire zéro en cas de défaillance précoce. Donc, la comparaison avec '\\ n' n'est pas correcte. – uba

Répondre

8

scanf retourne le nombre d'éléments d'entrée qui ont été adaptés avec succès et attribués, il est donc raisonnable de le faire:

while(scanf(...) == 1) 

Maintenant, vous voulez être capable de lire plusieurs nombres, chacun défini sur la nouvelle ligne. Ensuite, vous pouvez simplement faire ceci:

int array[100]; 
int i = 0; 

while(i < 100 && scanf("%d\n", &array[i]) == 1) 
    i++; 

noter que cette lecture ne cessera que si l'entrée non valide est entré (par exemple la lettre q) ou lorsque vous entrez la fin de l'entrée du code de commande, qui est Ctrl + Z (sous Windows) ou Ctrl + D (sous Mac, Linux, Unix).

+0

Merci beaucoup, ça marche! Résolu par Liho. – user2147954

+1

Notez que le \ n de fin dans la chaîne de format 'scanf()' est un désastre de l'interface utilisateur si les utilisateurs taperont l'entrée. L'entrée pour le premier nombre ne se termine pas jusqu'à ce que vous tapiez quelque chose (vraisemblablement le deuxième nombre) qui n'est pas un espace blanc. De plus, la nouvelle ligne dans la chaîne de format correspond à tout espace blanc - espaces ou tabulations ainsi qu'aux nouvelles lignes; il ne demande absolument pas de nouvelle ligne. Et, clou final dans le cercueil pour l'instant, les spécifications de conversion numérique comme «% d» sautent automatiquement l'espace blanc. Seuls '% c','% [...] '(ensembles d'analyse) et'% n' n'oublient pas les espaces. –

+1

Recommandation: supprimez le '\ n' de la chaîne de format. Le code fonctionnera mieux quand un humain 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 entre les nombres entrés.) Dans cet exemple, il y a des problèmes nécessitant que l'utilisateur soit prescient - sachant quoi entrez suivant.) –

0

Vous voulez faire

char discard; 

while(i < 100 && (scanf("%d%1[^\n]s", &arr[i], &discard)) == 2) 
i++; 

continuer à obtenir l'entrée jusqu'à une nouvelle ligne. Scan12() n'est pas le meilleur outil pour lire des lignes entières. Vous devriez utiliser fgets() pour lire la ligne, puis l'analyser en utilisant sscanf() ou d'autres fonctions.

+0

ne pas oublier de vérifier pour' i <100' ... – akira

+0

Cela fonctionnera-t-il? Je m'attendrais à ce qu'il y ait un espace blanc entre tous les nombres. – ams

0

La valeur de retour de scanf est le nombre d'entrées analysées par appel. Vous pouvez le comparer à l'entier 10 (ou '\ n'), qui arrêterait la boucle quand le scanf lirait réellement 10 éléments. (Et pour ce faire, il faudrait avoir dix spécificateurs dans la chaîne de format.

Vous pouvez

while((i<10) && (scanf("%d",a+i)==1)) i++; 

Accepter un certain nombre d'arguments doit être programmé, par exemple. Comme

while (fgets(mybuf, ALLOCATED_LENGTH-1, stdin)) { 
     char *p = mybuf; 
     if (*p=='\n') break; // or a better function to test for empty line 
     while (custom_scan_next_integer(&p)) i++; 
    } 

custom_scan_next_integer modifie le pointeur p pour renvoyer la quantité correcte de caractères

+0

Cela fonctionne, mais il manque tout le point de lire un nombre inconnu d'entrées dans un tableau. le nombre magique 10 n'est pas bon. Le point est que je ne sais pas combien de chiffres l'utilisateur entrera avant d'appuyer sur la touche Entrée – user2147954

2

La valeur de retour de scanf est le articles correspondants avec succès et attribués, alors essayez cette mettre fin quand une entrée non numérique est rencontré:

while (i < 100 && (scanf("%d", &a[i])) == 1) { i++; } 
+1

Ne fonctionne pas. Toujours dans une boucle infinie – user2147954

+0

@ user2147954: Parce que la lecture continue jusqu'à ce que l'entrée invalide ou EOF est entré. Vois ma réponse. – LihO

0

d'abord remplacer "%d" par " %d" cela évitera les nouveaux problèmes de ligne

seconde si votre entrée contient non entrée numérique alors votre boucle while entrera dans la boucle infinie. donc vous devez vérifier votre entrée si elle est une entrée numérique

+0

Ça ne marche pas. – user2147954

Questions connexes