scanf () пропускается - PullRequest
       1

scanf () пропускается

0 голосов
/ 24 марта 2011

Привет Только начал изучать c для универа (обычно использую цель c) и столкнулся со странной проблемой с scanf, у меня есть следующий код

   while(stringCheck == 0){
    scanf("%c",&computerType);
    computerType = toupper(computerType);

    if ( computerType == 'L') {
        /*set stringCheck to 1 so the scanf while loop breaks*/
        stringCheck = 1; 
        counter = 0;
    } else {
        printf("ERROR\n");
    }
}

Это я распечатал «ОШИБКУ», а затем запросил ввод (поэтому он пропускает настройку scanf в первый раз). Если я изменяю его на другую переменную, которая является строкой, она работает нормально, она останавливается в первый раз.

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

Я пробовал getChar(), и он делает то же самое.

Спасибо за любую помощь, которую вы можете предложить.

Ответы [ 3 ]

3 голосов
/ 24 марта 2011

Если при первом входе в цикл печатается ошибка, значит, во входном буфере уже что-то есть.Я гарантирую (при условии, что ваш компилятор не с ума сошел), что он не пропускает scanf.Вы должны проверить, что он на самом деле получает, изменив:

printf("ERROR\n");

на:

printf("ERROR, code = %02x\n", computerType);

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

Когда вы вводите L ENTER в первый раз, ваш код вытянет L, но не ENTER. Если вы тогдавызовите этот код еще раз, он получит клавишу ENTER.

Вы должны либо понимать и допускать то, что фактически было введено, либо использовать безопасную и звуковую функцию ввода, такую ​​как эта .

2 голосов
/ 24 марта 2011

Вы всегда должны проверять возвращаемое значение с scanf(); он говорит вам, сколько конверсий удалось. В этом контексте, если вы не вернетесь 1, у вас есть проблема. В первый раз в цикле scanf() читает символ, но не ell (l или L), потому что вы говорите, что получаете сообщение об ошибке. Следующая итерация пытается прочитать символ новой строки или что-то еще, что следует за предыдущим ошибочным символом, и символ новой строки, безусловно, не является символом ell, а другие символы, скорее всего, тоже не являются символом ell, что выдает по крайней мере еще одно сообщение об ошибке. Вы получите сообщение об ошибке для каждого непустого символа.

Как правило, если вы используете scanf(), это довольно сложно восстановить после ошибок. Скорее всего, вам лучше прочитать строку в буфер (массив символов) и использовать sscanf() для ее анализа.

1 голос
/ 07 ноября 2012

Вам просто нужно добавить пробел перед %c. Я не уверен, почему это работает, но это делает. Это также происходит с другими типами данных.

Замените ваш scanf оператор на scanf(" %c",&computerType);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...