scanf () работает без всякого ввода - PullRequest
3 голосов
/ 19 февраля 2012

У меня есть код на C, выполняющий некоторые вычисления (я полагаю, что это не имеет отношения к моему вопросу). Программа запросит некоторые параметры для расчета. Проблема в том, что когда я запускаю коды, scanf ("% c", & ch) не работает должным образом.

Меня интересует, можете ли вы воспроизвести эту проблему, потому что, похоже, я не ошибся, не так ли?

Я опубликовал скомпилированную и сокращенную версию моей программы.

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(void)
{
        float Dia_MM, Dia_I, Se1, Se, Sut = 75.00;
        float Ka, Kb, Kc, Kd, Ke, Kf;
        char Ch;
        char Bt;
        float Reli;
        printf("Please input the surface condition of the shaft: G, M, H or A\n");
        scanf("%c", &Ch);
//      getchar();
        printf("Please input the diameter of the shaft in inch\n");
        scanf("%f", &Dia_I);
        printf("Please specify whether your shaft is in bending (B) or torsion (T)");
        scanf("%c", &Bt);// THIS LINE IS JUST SKIPPED
        exit(0);
}

В списке журнала GDB:

  Breakpoint 1, main () at main.c:25
  25        float Dia_MM, Dia_I, Se1, Se, Sut = 75.00;
  (gdb) n
  30        printf("Please input the surface condition of the shaft: G, M, H or A\n");
  (gdb) n
  Please input the surface condition of the shaft: G, M, H or A
  31        scanf("%c", &Ch);
  (gdb) G
  Undefined command: "G".  Try "help".
  (gdb) n 
  G
  33        printf("Please input the diameter of the shaft in inch\n");
  (gdb) n
  Please       input the diameter of the shaft in inch
  34        scanf("%f", &Dia_I);
  (gdb) n
  4.5
  35        printf("Please specify whether your shaft is in bending (B) or torsion (T)");
  (gdb) n
  36            scanf("%c", &Bt);
  (gdb) n                            //PROBLEM HERE. SCANF() GOES BEFORE TAKE ANY INPUT.
  37        exit(0);

Ответы [ 3 ]

4 голосов
/ 28 января 2013

Как сказано выше thkala scanf() не использует конечные символы новой строки. Но есть другой способ поглотить символ новой строки, используя \n, например scanf("%c\n",...).

4 голосов
/ 19 февраля 2012

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

scanf() немного громоздко с переводом строки. Возможное решение - использовать fgets(), чтобы получить строку из консоли, а затем использовать sscanf() для анализа полученной строки.

Другим, более целенаправленным решением было бы использование " %c" в строке формата последнего вызова scanf(). Спецификатор формата %c сам по себе не использует начальные пробелы, поэтому он получает оставшуюся новую строку, а не символ, введенный пользователем.

0 голосов
/ 12 июня 2015

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

scanf(" %c",&c);
...