Scanf не принимает данные - PullRequest
1 голос
/ 09 ноября 2010

Я нахожусь во вводном классе C, и у меня проблема с вводом данных. Я нахожусь в середине упражнения по подпрограммам, и мой код кажется правильным, но по какой-то причине один вопрос в программе обходит стороной, и я не могу понять это.

1) Программа читает номер книги ISBN в виде 10 отдельных символов (отметка)

2) Программа читает цену книги (чек)

3) Программа показывает количество учеников в классе (чек)

4) программа спрашивает, является ли книга более новой или более старой редакцией (не работает !!)

5) Программа спрашивает, требуется ли книга или предлагается (проверить)

Я использую char для вопросов, касающихся новых или старых, а также требуемых или предлагаемых, как мы полагаем, dto, чтобы использовать то, что мы уже изучили.

Я не могу понять, почему один из вопросов обходит стороной.

Вот мой вывод:

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

Как видите, scanf для 4-го вопроса игнорируется. Вот код, который я написал до сих пор. Любая помощь с благодарностью.
Спасибо.

#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

Ответы [ 3 ]

8 голосов
/ 09 ноября 2010

«Нормальные» scanf спецификаторы преобразования (% d,% e,% s) пропускают первые пробелы. Спецификатор преобразования% c - нет.

Чтобы принудительно пропустить пробел, включите пробел в строку формата:

scanf(" %c", &edition);

в противном случае scanf прочитает [ENTER], которое вы использовали для предыдущей строки

0 голосов
/ 25 декабря 2013

Вы также можете использовать

    gets(str);

для приема пробелов

0 голосов
/ 09 ноября 2010

scanf ... плохо себя ведет, и на практике вы никогда не захотите его использовать.Однако, если это назначено, я думаю, ты должен.Google находит это .Помимо flushall (), другой обходной путь - это просто удвоить строку scanf ("% c", edition) - первая будет есть новую строку, а вторая получит ваш ввод.

...