Ваша проблема в том, что спецификатор преобразования %c
не заставляет scanf()
пропускать начальные пробелы.Вам нужно обработать символ новой строки, который все еще находится в потоке после прочтения вашего ввода.
Входной поток пуст, когда scanf()
вызывается первый раз в цикле, поэтому он ждет, когда вы что-то наберете.Вы набираете s
и нажимаете клавишу Enter, поэтому поток ввода содержит символы s
и \n
(перевод строки).scanf()
удаляет s
из входного потока и присваивает его op
.Когда scanf()
вызывается во второй раз, входной поток не пуст;в нем по-прежнему есть символ \n
, поэтому scanf()
читает его и присваивает его op
, что приводит к сбою условия цикла, поэтому цикл завершается.
Есть несколько способов обойти эту проблему.Я собираюсь порекомендовать прочитать строки в отличие от отдельных символов, использующих fgets()
, следующим образом:
char op[3] = {0}; // input character + newline character + 0 terminator
do
{
printf("¿Sigues?");
if (fgets(op, sizeof op, stdin))
{
/**
* Check for a newline character in the input. If it's not there
* then the user typed in too many characters. In order to keep
* the input stream from getting clogged up with bad input, read
* until we find a newline character.
*/
char tmp[3];
char *newline = strchr(op, '\n');
while (!newline && fgets(tmp, sizeof tmp, stdin))
{
newline = strchr(tmp, '\n');
}
}
else
{
printf("Error while reading input\n");
op[0] = 0;
}
} while (tolower(op[0]) == 's');