2010-11-09 28 views
1

Je suis dans une classe d'introduction C et j'ai un problème avec la saisie de données. Je suis au milieu d'un exercice sur les sous-programmes et mon code semble correct, mais une question dans le programme est contournée pour une raison quelconque, et je ne peux pas le comprendre.scanf ne prend pas de données

1) Le programme lit dans un numéro de livre ISBN comme 10 caractères séparés (contrôle)

2) Le programme lit dans un prix du livre (chèque)

3) Le programme lit dans le nombre d'élèves dans une classe (chèque)

4) le programme demande météo le livre est une édition plus récente ou une ancienne édition (ne fonctionne pas !!)

5) le programme demande météo le livre est Ré Quired ou Suggested (check)

J'utilise char pour les questions concernant le nouveau ou l'ancien, et requis ou suggéré, comme nous le supposons dto afin d'utiliser ce que nous avons appris jusqu'ici.

Je ne comprends pas pourquoi l'une des questions est ignorée.

Voici ma sortie:

Enter ISBN: 1231231231 

Enter list price per copy: 54.99 

Enter expected class enrollment: 45 

Enter N for new edition or O for Older edition: 
Enter R for Required or S for Suggested: R 



ISBN: 1-23-123123-1 

List Price: 54.99 
Expected enrollment: 45 
Edition, New or Old: 

Importance, Required or Suggested: R 

Comme vous pouvez le voir, le scanf pour la 4ème question est ignorée. Voici le code que j'ai écrit jusqu'ici. Toute aide est grandement appréciée.
Merci.

#include <stdio.h> 

#define WHOLESALE 80 

void getInput(char* a, char* b, char* c, char* d, char* e, 
       char* f, char* g, char* h, char* i, char* j, 
       float* listPrice, int* numStudents, char* edition, char* importance); 
void calc(); 
void calcBooks(); 
void calcProfit(); 
void output(); 


int main (void) { 
    // Local declarations 
    float listPrice; 
    int  numStudents; 
    char edition;  
    char importance; 

    // ISBN char variables: 
    char a; // 1 
    char b; // 2 
    char c; // 3 
    char d; // 4 
    char e; // 5 
    char f; // 6 
    char g; // 7 
    char h; // 8 
    char i; // 9 
    char j; // 10 

    // Get input 
    getInput(&a, &b, &c, &d, &e, &f, &g, &h, &i, &j, &listPrice, 
      &numStudents, &edition, &importance); 



    // Calculate 



    // Output 
    printf("\nISBN: %c-%c%c-%c%c%c%c%c%c-%c\n", a, b, c, d, e, f, g, h, i, j); // ISBN output 
    printf("\nList Price: %6.2f", listPrice); 
    printf("\nExpected enrollment: %d", numStudents); 
    printf("\nEdition, New or Old: %c", edition); 
    printf("\nImportance, Required or Suggested: %c", importance); 

    return 0; 
} // main 


/* =============== getInput ========================================== 
    Gets input from the user. 
    Pre: addresses for ISBN (in seperate characters) 
      and for listPrice, numStudents, importance, and edition. 
    Post: Passes back values thru the addresses. 
*/ 
void getInput(char* a, char* b, char* c, char* d, char* e, 
       char* f, char* g, char* h, char* i, char* j, 
       float* listPrice, int* numStudents, char* edition, char* importance) 
{ 
    printf("\nEnter ISBN: "); 
    scanf("%c%c%c%c%c%c%c%c%c%c", a,b,c,d,e,f,g,h,i,j); 

    printf("\nEnter list price per copy: "); 
    scanf("%f", listPrice); 

    printf("\nEnter expected class enrollment: "); 
    scanf("%d", numStudents); 

    printf("\nEnter N for new edition or O for Older edition: "); 
    scanf("%c", edition); 

    printf("\nEnter R for Required or S for Suggested: "); 
    scanf("%c", importance); 




    return; 
} // getInput 

Répondre

8

La conversion "normal" scanf (% d spécificateurs,% e,% s) sauter les espaces au. Le spécificateur de conversion% c ne l'est pas.

Pour forcer un saut d'espaces, comprennent un espace dans la chaîne de format:

scanf(" %c", &edition); 

autrement scanf va lire le vous [ENTRER] utilisé pour la ligne précédente

+0

'' scanf' a besoin et 'pour stocker un caractère! – haccks

0

scanf est ... pas bien comporté, et en pratique, vous ne voulez jamais l'utiliser. Cependant, si c'est assigné, je suppose que tu dois y aller. Google trouve this. En plus de flushall(), une autre solution consiste à doubler la ligne scanf ("% c", édition) - la première va manger le retour à la ligne et la seconde va recevoir votre entrée.

+0

Merci. Au cours de ma frustration j'ai remarqué de futures façons de saisir les caractères mais oui, je dois suivre les règles de la classe pour celui-ci. – supergalactic

+3

@cloudhead: Que google find suggère l'utilisation de * la fonction non-indicable * LOL! ** N'UTILISEZ JAMAIS 'gets'. JAMAIS JAMAIS JAMAIS ** Utilisez 'fgets' suivi de' sscanf'; utilisez scanf avec un espace dans la chaîne de format; lisez les caractères 1 par 1 avec getchar() --- mais n'utilisez pas 'gets' – pmg

+0

+1 pour les combos' fgets' et 'sscanf'. L'un fait l'IO et l'autre l'analyse. 'scanf' a trop de cas de bordure. – leesei

-1

vous pouvez également utiliser

gets(str); 

accepter des espaces vides