2009-09-10 9 views
1

Comment obtenir et imprimer un caractère d'un utilisateur? Ce besoin faire ...Obtention et impression de caractères dans C?

#include <stdio.h> 
int main() { 

    float number1; 
    char mychar = ' '; 

    printf("Number?\n"); 
    scanf("%f", &number1); 

    printf("Character?\n"); 
    scanf("%c", &mychar); 

    printf("You typed number: %f\n", number1); 
    printf("You typed the char: %c\n", mychar); 
} 
+2

Il n'est pas clair si vous voulez une solution C ou C++, car votre liste de titres et de mots-clés est en conflit. –

+1

Sonne comme des devoirs pour moi – Glen

+3

Votre question contient déjà la réponse. –

Répondre

3

Le problème que vous voyez est qu'il est vraiment en train de lire un personnage, mais il est tout simplement pas le personnage que vous vous attendez. scanf fait une entrée formatée. La première fois que vous l'appelez, vous lui dites d'attendre un numéro. Mais vous êtes vraiment entrer dans plus qu'un simple numéro:

Number? 
1234.5678<enter> 

Lorsque vous appuyez sur la touche entrée, il insère en fait un caractère dans votre flux d'entrée. Comme vous le savez, nous utilisons \ n pour représenter newline, le caractère que vous obtenez lorsque vous appuyez sur Entrée. Votre flux d'entrée ressemble donc à "1234.5678 \ n". Alors scanf fait son truc et lit 1234.5678, puis il voit '\ n'. Il dit "oh, ça ne fait pas partie du numéro, alors je vais arrêter." Eh bien, votre entrée a toujours le '\ n'. La prochaine fois que vous appelez scanf, vous lui dites de lire un caractère. L'utilisateur tape tout ce qu'il veut, mais cela va derrière le '\ n' du scanf précédent. Alors scanf essaie de faire correspondre le flux d'entrée avec un caractère et dit "ok, la première chose dans ce flux d'entrée est un caractère, et c'est '\ n', donc je vais retourner ça." Les données saisies par l'utilisateur restent dans le flux d'entrée.

Donc, un moyen simple de s'en débarrasser est d'avoir une boucle qui vide tous les caractères restants du flux d'entrée jusqu'à ce qu'il trouve '\ n'.

printf("Number?\n"); 
scanf("%f", &number1); 
while(getchar() != '\n'); 

Après l'exécution de cette boucle, votre flux d'entrée sera vide. Ainsi, la prochaine fois que vous appellerez scanf, il attendra que l'utilisateur tape quelque chose et utilisera tout ce que l'utilisateur a tapé.

Notez également que scanf a une valeur de retour que vous devriez vérifier après l'avoir appelée. Lisez à propos de scanf pour voir ce qu'il retourne.

+0

réponse Ok, fantastique, l'un des meilleurs que je l'ai jamais vu. Merci. /C –

+1

Alternativement, vous pouvez utiliser fgets() pour lire la ligne d'entrée entière sous forme de texte, puis utilisez sscanf () ou strtod() pour récupérer la valeur numérique. –

-1

recherche gets(), getc() etc -

+5

N'utilisez JAMAIS get. fgets, getc, fgetc, etc sont bien, mais ne jamais utiliser obtient. –

+1

Oui, ne devrait jamais, ne jamais être utilisé. Gcc se plaindra correctement si vous essayez de l'utiliser: "test.c :(.text + 0xa): warning: la fonction 'gets 'est dangereuse et ne devrait pas être utilisée." – hlovdal

2

Comme commenté, vous êtes question contient déjà la réponse. Mais de toute façon:

Si vous voulez faire la même chose en C++, vous pouvez utiliser les flux:

int mynumber; 
char mychar; 
cout << "Number?" << endl; 
cin >> mynumber; 
cout << "Character?" << endl; 
cin >> mychar; 
cout << "you typed number " << mynumber << " and char " << mychar << endl; 

Bien sûr, votre implémentation C fonctionnerait aussi bien en C++.

(Si vous développez une application plus grave, je vous conseille d'utiliser quelque chose de plus sophistiqué qu'un simple cin ou scanf)

2

En C, vous n'avez pas besoin d'utiliser scanf pour obtenir des caractères simples. Vous pouvez utiliser la fonction getchar():

printf("Would you like a donut? [Y/N] "); 
answer = getchar(); 

switch(answer) { 
    case 'y': 
    case 'Y': 
     printf("Mmmm... donuts!"); 
     break; 
    case 'n': 
    case 'N': 
     printf("Eugh... donuts?"); 
     break; 
    default: 
     printf("You should never ignore code offering donuts."); 
     break; 
} 
+1

Comptez une pause après la valeur par défaut de printf(), elle ne fait pas de mal et économise les cheveux gris après un changement imprudent –

+0

Merci, bonnes habitudes sont toujours les bienvenus. – deau

Questions connexes