Не удается получить символы последовательно в цикле

#c #loops #character

#c #циклы #символ

Вопрос:

Это всего лишь простая программа, которая пытается получить символы, пока не будет введено ‘0’. Но, когда я выполняю это в Code::Blocks 17.12, терминал, кажется, всегда получает два символа в качестве входных данных перед печатью введенного символа.

 char temp;
do  {
     printf("Enter character: ");
     scanf("%c ",amp;temp);
     printf("Character entered: [%c]n",temp);
}while(temp!='0');
  

Результат, который я получил, был

 Enter character: a
b
Character entered: [a]
Enter character: c
Character entered: [b]
Enter character: d
Character entered: [c]
Enter character: e
Character entered: [d]
Enter character: 0
Character entered: [e]
Enter character: 0
Character entered: [0]
  

Мой ожидаемый результат был

 Enter character: a
Character entered: [a]
Enter character: b
Character entered: [b]
Enter character: c
Character entered: [c]
Enter character: c
Character entered: [c]
Enter character: 0
Character entered: [0]
  

Ответ №1:

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

Решение состоит в том, чтобы пропустить начальный пробел в строке формата " %c" .

Комментарии:

1. У меня есть еще одно сомнение, я пробовал scanf («% c n»,amp;temp); Почему это не сработало?

2. @suryathiags Для scanf любой символ пробела в строке формата равен, не имеет значения, является ли это табуляцией ( 't' ), пробелом ( ' ' ) или новой строкой ( 'n' ). Таким образом, завершающий символ новой строки ничем не отличается от того, что у вас уже было.

3. Последний вопрос. Я попробовал исходный код в Gfg ide, и это сработало. Входные данные были a b c d e 0 . Насколько я могу судить, это сработало, потому что это был тот же случай, но затем, поскольку после последнего 0 ничего нет, он, должно быть, принял 0 в качестве входных данных. Прав ли я в какой-то степени?

4. @suryathiags Для автоматизированных систем входные данные обычно передаются по каналу в программу. И когда ввод закончится, чтение из канала приведет к завершению файла ( EOF ). Вероятно, это то, что там произошло.