2012-12-02 2 views
1

J'essaie d'obtenir une entrée dans un tableau, jusqu'à ce qu'un utilisateur entre -1 pour quitter le mode d'entrée.Code C suspendu à l'instruction scanf()

Quelque chose d'étrange se produit dans ce bloc de code quand un -1 est entré mais seulement après avoir entré au moins deux valeurs.

#define ARRAYSIZE 100 
int input[ARRAYSIZE]; 
int i=0; 
do { 
    printf("Enter data #%d or -1 to exit: ", i); 
    scanf("%d", &input[i]); 
} while(input[i++] != -1 && i<ARRAYSIZE) 

Le code va simplement se bloquer indéfiniment. J'ai compilé et exécuté sur deux architectures séparées, mais le problème n'apparaît pas lorsqu'il est exécuté dans gdb. L'insertion d'instructions d'impression a révélé que le code est en effet suspendu à l'instruction scanf.

Est-ce que quelqu'un a une idée de ce qui pourrait être à l'origine de cela?

+0

Euh, est-il pendre encore après avoir frappé "entrer"? Est-ce que "input []" est déclaré être un tableau d'entiers avec un ou plusieurs éléments "int"? Est-ce que "i" est initialisé à 0 avant d'entrer dans la boucle? – paulsm4

+0

Oui, merci J'ai modifié la question pour clarifier cela –

+0

Qu'est-ce que l'entrée? Pourquoi ne pas juste 'input [i ++]! = - 1' comme vérification de sortie? – asheeshr

Répondre

2

vous ne vérifier la valeur des données que vous avez enregistré (il était de vérifier l'élément suivant uninitialized), faire tout est un meilleur ajustement

#define ARRAYSIZE 100 
int input[ARRAYSIZE],i=0; 
do {printf("Enter data #%d or -1 to exit: ", i); 
    scanf("%d", &input[i]); 
}while(input[i] != -1 && ++i<ARRAYSIZE); 
//if this is main() you need a return 0; here also or it will hang 
+1

+1 Vous m'avez battu avec des secondes ... était sur le point d'afficher la même logique. – exexzian

+0

@sansix probablement parce que j'ai gagné du temps en oubliant de mettre le -ing sur la deuxième vérification :) – technosaurus

+0

hahaha qui pourrait être le cas :) – exexzian

0

Mes questions:

3) est "i" initialisées à 0 avant d'entrer dans la boucle? 2) Est-ce que "input []" est déclaré être un tableau d'entiers avec un ou plusieurs éléments "int"?

... et ...

1) Est-ce que pendre encore une fois que vous appuyez sur "Entrée"?

Si vous n'êtes pas déjà au courant, vous doit la touche « Entrée » avant scanf() traitera toute entrée.

SUGGESTION:

#include <stdio.h> 
#define ARRAYSIZE 100 

int 
main() 
{ 
    int input[ARRAYSIZE]; 
    int i=0; 
    int entry=0; 
    while(entry != -1 && i<ARRAYSIZE) { 
    printf("Enter data #%d or -1 to exit: ", i); 
    scanf("%d", &input[i]); 
    entry = input[i]; 
    fprintf (stderr, "entry= %d, input[i]= %d...\n", entry, input[i]); 
    i++; 
    } 
    printf ("Done.\n"); 
    return 0; 
} 

Notez le "fprintf (stderr)".

SORTIE EXEMPLE:

Enter data #0 or -1 to exit: 300 
entry= 300, input[i]= 300... 
Enter data #1 or -1 to exit: -1 
entry= -1, input[i]= -1... 
Done. 

Encore une fois - s'il vous plaît préciser si oui ou non vous utilisez la touche « Entrée ». Si oui, merci de nous indiquer votre plateforme (par exemple Windows, Linux, MacOS, etc.).

« espoir qui aide ...

+1

Vos questions doivent être des commentaires sous la question réelle .. – asheeshr

+0

Où 'entry' déclaré? – AnT

+0

@AndreyT - merci :) – paulsm4

0

Votre code dépend des valeurs des éléments du tableau non initialisées. Pas étonnant qu'il se comporte de façon irrationnelle. Dans la condition de votre cycle while vous comparez input[i] avec -1. À chaque itération input[i] n'est pas initialisé - il contient une valeur de poubelle. Puisqu'une valeur de la poubelle est plutôt peu probable d'être égale à -1, votre cycle continue de fonctionner et de s'arrêter, en s'arrêtant chaque fois à scanf pour attendre la saisie. Cela crée une illusion de "pendaison à scanf", alors qu'en réalité le scanf lui-même n'a rien à voir avec le vrai problème.

Bien sûr, le vrai problème ici n'est pas que le tableau est non initialisé, mais plutôt que votre condition de cycle vérifie l'élément de tableau erroné. Vous avez probablement l'intention de vérifier l'élément le plus récemment entré. Au lieu de cela, vous vérifiez l'élément suivant. Pourquoi?

Je dirais que votre intention appelle un cycle avec post condition.

0

Utilisez une variable différente pour vérifier -1. Quelque chose comme ceci:

#include <stdio.h> 
#define ARRAYSIZE 10 

int main(int argc, char **argv) { 
    int data[ARRAYSIZE]; 
    int input = 0; 
    int i = 0;  

    while(input != -1 && i < ARRAYSIZE) { 
     scanf("%d", &input); 
     data[i] = input; 
     i++; 
    } 

    return 0; 
}