2016-06-25 1 views
-1

J'essaye d'employer la fonction d'EOF mais elle ne fonctionne pas comme je l'attend. En mode débogueur, il ne détecte pas la seconde fonction "scanf" et continue simplement. Il continue à manquer la fonction "scanf" de temps en temps. Code est ci-dessousEOF ne fonctionne pas comme prévu (C)

int main() { 
    char tempString; 
    int i = 0; 
    printf("Enter your letter\n"); 
    scanf_s("%c", &tempString); 

    while (tempString != EOF) { 

     printf("You entered:%c\n", tempString); 
     scanf_s("%c", &tempString); 
    } 
} 

J'ai aussi essayé d'utiliser la fonction getchar(), mais la même chose se produit, le code est affiché ci-dessous:

int main() { 
    char tempString; 
    int i = 0; 
    printf("Enter your letter\n"); 


    while ((tempString = getchar()) != EOF) { 

     printf("You entered:%c\n", tempString); 

    } 
} 

Merci d'avoir lu

+2

'' tempString' doit être int' – pzaenger

+0

'char tempString; ' - >> 'int tempString;' dans le deuxième ptogramme. Dans le premier programme, vous pouvez vérifier le retour de scanf(). (et scanf_s() est un non-sens) – wildplasser

+0

@wildplasser scanf_s est le terme pour les studios visuels –

Répondre

3

EDIT:

Premièrement, vous avez omis l'argument de longueur requis par scanf_s pour les formats %c et %s.

Ensuite, le format %c prend le caractère suivant à partir du tampon d'entrée. À la deuxième entrée (et aux suivantes), il restait un newline dans le tampon d'entrée de la première entrée. L'ajout d'un space avant que le spécificateur de format %c supprime cet espace de début.

D'autres formats, tels que %s et %dfont ignorer les espaces au, mais pas %c.

En troisième lieu, avec scanf l'utilisation de EOF n'est pas le chemin à parcourir, vous devez contrôler la boucle avec la valeur de retour de scanf qui vous indique le nombre d'éléments correctement lus. Ce programme commence par scanf_s. La deuxième entrée ignore la newline après la première entrée.

Ensuite, il passe à getchar. Dans ce test, la valeur de retour de la fonction est int, donc c'est mon type de données ici. De cette façon, EOF (-1) ne sera pas en conflit avec les données de caractères requises. Notez que getchar commence par lire le newline laissé après le scanf_s précédent (qui ignore seulement menant espace.

#include <stdio.h> 

int main(void) 
{ 
    char ch_scanf;         // char type 
    int ch_getchar;         // int type 
    printf("Using scanf_s\n"); 
    if (scanf_s(" %c", &ch_scanf, 1) == 1) {  // consumes any leading whitespace 
     printf("scanf_s value: %d\n", ch_scanf); 
    } 
    if (scanf_s(" %c", &ch_scanf, 1) == 1) {  // consumes any leading whitespace 
     printf("scanf_s value: %d\n", ch_scanf); 
    } 

    printf("\nUsing getchar\n"); 
    while ((ch_getchar = getchar()) != EOF) { 
     printf("getchar value: %d\n", ch_getchar); 
    } 

    return 0; 
} 

Exemple de session:

Using scanf_s 
A 
scanf_s value: 65 
B 
scanf_s value: 66 

Using getchar 
getchar value: 10 
C 
getchar value: 67 
getchar value: 10 
^Z 

Enfin, si vous souhaitez utiliser la fonction de bibliothèque standard scanf sans MSVC vous cochant, vous pouvez le faire comme ça

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
+0

d'abord merci de poster une réponse, mais je ne vous vois pas en utilisant la fonction EOF avec une boucle while –

+0

Accrochez-vous je vais modifier ... –

+0

@BiaKhan si avoir révisé la réponse pour comparer l'utilisation de 'scanf_s' et' getchar' ... notez que 'EOF' n'est pas une fonction. C'est une macro donnant une valeur entière. –

1

essayer

#include <stdio.h> 

int main(void) { 
    char tempString; 

    printf("Enter your letter\n"); 

    while (scanf_s("%c%*c", &tempString, 1) != EOF) {//%*c for consume newline, 1 is buffer size 
     printf("You entered:%c\n", tempString); 
    } 

    return 0; 
} 

int tempString;//int for check EOF 

printf("Enter your letter\n"); 

while ((tempString = getchar()) != EOF) { 
    printf("You entered:%c\n", tempString); 
    getchar();//consume newline 
} 
0

Le comportement de la fonction scanf() en C

est de lire l'entrée de la mémoire tampon du clavier jusqu'à ce qu'il rencontre EOF (c.-à-; jusqu'à ce que nous de la touche Entrée)

En général, il est conseillé d'utiliser « % c » en C pour lire un caractère d'entrée parce que

La valeur est collectée dans le tampon du clavier jusqu'à ce que nous avons atteint entrez et nous ne pouvions pas empêcher l'utilisateur d'entrer un seul caractère

Ainsi, la meilleure façon d'obtenir un caractère est d'utiliser la fonction getchar().

Dans le programme que vous avez fourni, vous pouvez utiliser n'importe quel autre caractère pour vérifier la fin et non EOF puisqu'il est utilisé dans l'implémentation scanf() pour marquer la fin de l'entrée.

Vous pouvez d'autres clés comme esc pour vérifier la fin

#include <stdio.h> 
#include <stdlib.h> 

#define esc 27 

int main() 
{ 
    char ch; 

    while((ch = getchar()) != esc) { 

     //print the entered character here 
    } 
} 

Pour connaître en profondeur sur la mise en œuvre scanf() examiner cette scanf() source code

+0

_In fonction 'main': référence non définie à' getch'_. Je suppose que ça devrait être 'getchar()'? Si oui, alors il devrait aussi être 'int ch;'. – pzaenger

+0

Ouais! C'est getchar() selon C99. Avoir édité le code. @pzaenger – lsof

+0

"jusqu'à ce qu'il rencontre EOF" n'est pas "jusqu'à ce que nous appuyions sur la touche Entrée", qui peut être la fin de la ligne mais pas la fin du fichier (et 'scanf()' lira la fin de la ligne). Vous semblez associer une mise en mémoire tampon avec 'scanf()' ... mais la mise en mémoire tampon est une opération distincte qui se produit avant que l'entrée n'atteigne 'scanf()' ou d'autres fonctions d'entrée et ne modifie l'entrée, seulement quand. De plus 'getch()' n'est pas standard, et n'est pas vraiment équivalent à 'getchar()' de toute façon - on n'est pas une version plus récente de l'autre ... ce sont juste des fonctions différentes qui font des choses similaires, mais de différentes manières. – Dmitri