scanf
считывает форматированный ввод, поэтому при использовании %s\n”, &str
строка будет использована и сохранена в str
, как и символ новой строки, который будет присутствовать в буфере при нажатии клавиши ввода, строка будет сохранена и символ новой строки будет отброшен.
Обратите внимание, что правильное использование: “%s\n”, str
, str
уже указатель, вы не должны использовать &
.
Когда вы используете “%s”, &str
символ новой строки останется в буфере и будет использован в следующем l oop, поэтому str
будет сохранен в первой итерации, а "\n"
будет сохранен в str
в следующей итерации , только тогда вас снова попросят ввести данные на третьей итерации.
Для завершения, как указано в комментариях ниже, согласно определению scanf
:
... любой отдельный символ пробела в строке формата потребляет все доступные последовательные символы пробела из входных данных (определяется как при вызове isspace в al oop ). Обратите внимание, что нет разницы между "\ n", "", "\ t \ t" или другими пробелами в строке формата.
Я бы также посоветовал вам ограничить размер строки, ожидаемый scanf
, чтобы избежать переполнения контейнера, что-то вроде %99s
для контейнера из 100 символов, как у вас, а также отметьте scanf
return, в данном случае это должно быть = 1
для каждого цикла.
Чтобы сделать то, что вы хотите, я собираюсь получить символ из stdin
без нажатия return, вам потребуется спецификация SO Метод c, вот небольшой пример для Windows с использованием библиотеки <conio.h>
и getch()
:
#include <stdio.h>
#include <conio.h>
int main()
{
int i = 1, c;
while (1)
{
if ((c = getch()) == '*')
return 0;
else if (c == 'H')
printf("Case %d: Hajj-e-Akbar\n", i);
else
printf("Case %d: Hajj-e-Asghar\n", i);
i++;
}
}
Для Linux одним из вариантов является также использование getch () из <ncurses.h>
библиотеки, которую вам может понадобиться установить .
PS: Не волнуйтесь, ваш вопрос хорошо продуман, особенно если он занимает второе место на сайте.