2017-10-06 37 views
0

Je ne comprends pas pourquoi la condition dans ne reflète pas les résultats. J'ai entré des valeurs qui n'étaient pas égales à 1 comme spécifié par la condition et il est toujours imprimé. Est-ce que quelqu'un peut m'expliquer s'il vous plaît pourquoi c'est le cas.Pourquoi la fonction printf imprime-t-elle l'entrée de valeur même si la valeur d'entrée dans scanf n'est pas égale à 1

#include<stdio.h> 

int main() { 
int n; 
while (scanf("%d", &n) == 1) 
    printf("%d\n",n); 
return 0; 
} 

Répondre

0

Je pense que vous n'êtes pas correctement variable n comparez avec 1. Donc, si je ne me tromper. Essayez de comparer n avec 1.

int main() { 
int n; 
while (scanf("%d", &n) == 1){ 
    if(n!=1){ 
    break; 
    } 
    printf("%d\n",n); 
}  
return 0; 
} 

Cela peut être une réponse bâclée, mais c'est un exemple.

+0

'' scanf' peut retourner EOF', donc en plus de votre 'si (n! = 1)' chèque, votre 'while' condition doit être' while (scanf ("% d", et n) == 1) '. – user694733

0

Le problème est que vous n'êtes pas comparer la valeur de n qui est l'entrée lue, mais la valeur retournée par la fonction scanf qui est le nombre d'entrées que vous avez, dans votre cas est toujours 1.

plus de détails: Value returned by scanf function in c

Ce code devrait fonctionner dans votre cas:

#include<stdio.h> 

int main() { 
    int n; 
    scanf("%d", &n); 
    while(n == 1){ 
     printf("%d\n",n); 
     scanf("%d", &n); 
    } 
    return 0; 
} 
+1

Vous devriez toujours vérifier la valeur de retour. Vous lirez la valeur non initialisée de 'n' si l'utilisateur entre une valeur invalide. – user694733

+0

Considérez également ce qui se passe si je devais entrer '1 x'. –

1

scanf renvoie le nombre d'entrées de lecture et affecté, pas la valeur de l'entrée lui-même. Dans ce cas particulier, vous n'attendez qu'une seule entrée, donc scanf retournera 1 en cas de succès, 0 en cas d'échec de correspondance (l'entrée ne commence pas avec un chiffre décimal), ou EOF s'il voit la fin de fichier ou une erreur.

Si vous souhaitez tester contre la valeur de l'entrée, vous feriez quelque chose comme

while(scanf(“%d”, &n) == 1 && n == EXPECTED_VALUE) 
{ 
    printf(“%d”, n); 
} 

Modifier

En fait, une meilleure façon de le faire serait quelque chose comme ceci:

int n; 
int itemsRead; 

/** 
* Read from standard input until we see an end-of-file 
* indication. 
*/ 
while((itemsRead = scanf("%d", &n)) != EOF) 
{ 
    /** 
    * If itemsRead is 0, that means we had a matching failure; 
    * the first non-whitespace character in the input stream was 
    * not a decimal digit character. scanf() doesn't remove non- 
    * matching characters from the input stream, so we use getchar() 
    * to read and discard characters until we see the next whitespace 
    * character. 
    */ 
    if (itemsRead == 0) 
    { 
    printf("Bad input - clearing out bad characters...\n"); 
     while (!isspace(getchar())) 
     // empty loop 
     ; 
    } 
    else if (n == EXPECTED_VALUE) 
    { 
    printf("%d\n", n); 
    } 
} 

if (feof(stdin)) 
{ 
    printf("Saw EOF on standard input\n"); 
} 
else 
{ 
    printf("Error while reading from standard input\n"); 
}