Почему у меня проблемы с Scanf и получает? - PullRequest
3 голосов
/ 23 ноября 2010

когда я пытаюсь использовать scanf и get, у меня возникают проблемы, мне нужно поставить get дважды, если я ставлю его после завершения моей программы, это домашняя работа, и я должен использовать эти функции в этих местах.

код:

int main()  
{
    int i=0,operation=0;
    char str[100];

    printMenu();

    scanf("%d",&operation);

    switch (operation)
    {
        case 1:     
            printf("Please, enter your sentence >");
            gets(str);
            gets(str);

            if (checkChars(str))
                inputSent(str);
            else
                printf("ERROR: Incorrect data, try again.");

            break;
    }   

    return 0;
}

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Итак, у нас есть поток данных stdin.Это ввод, который вы пишете на терминале.

Когда вы звоните scanf, он читает только десятичное число, которое вы написали.Он не читает символ новой строки после него.Следовательно, вам нужно два вызова на gets, потому что первый вызов видит только '\n', а второй видит ваши фактические данные.

Чтобы это исправить, я рекомендую вам использовать get для чтения полной строкикогда вы получите операцию, а затем используйте sscanf, чтобы получить операцию.

Например:

printMenu();

gets(str)
sscanf(str, "%d", &operation);

switch (operation) {
0 голосов
/ 23 ноября 2010

То, что происходит после вашего первого scanf(), заключается в том, что во входном буфере все еще остаются данные (любая форма пробела, которая ограничивает вещи, обычно это возврат), и когда вы вызываете следующий gets(), он сразу возвращается, потому что читает«ввод» вы нажали после ввода числа.Чтобы решить эту проблему, вам нужно очистить входной буфер.Это хорошая практика, особенно при переключении между чтением отдельных символов и предложений.Вот небольшой фрагмент, который я нашел в другом потоке, который может вам помочь (это будет после вашего scanf()):

while (getchar() != EOF);
Что он делает, это постоянно читает символы из входного буфера, пока ничегоосталось.Это может быть не лучшим решением для всех ситуаций, но этого должно быть достаточно, чтобы помочь вам выполнить это задание.

...