Вы вводите номер и затем нажимаете клавишу ввода. Строка формата "%d"
будет читать до первого целого числа и не будет читать введенный вами символ новой строки. Этот символ перевода строки остается в буфере, который читается в первом scanf
в цикле со спецификатором "%c"
. Поэтому check == 'y'
становится ложным, поскольку check
содержит 0x0a
, то есть эквивалент ASCII новой строки, после того, как он прочитал новую строку.
Обратите внимание, что если вы хотите, чтобы ваш фрагмент кода работал именно так, вам нужно вводить числа и параметры y / n один за другим, без новой строки (0x0a
), пробела (0x20
) или других сепараторы. Например, если вы хотите суммировать список 1, 2, 3, 4, 5, вам необходимо ввести его в код следующим образом: 1y2y3y4y5n
. Если вы введете оператор printf
, печатающий значение status
после scanf
с запросом да / нет, вы можете ясно увидеть, что последний непрочитанный символ читается "%c"
.
Если вы хотите ввести цифры и разделенные опции, вам нужно использовать дополнительный символ. Что вы можете сделать, используя getchar ()
или используя оператор подавления аргумента в строке формата: scanf ("%*c%c", &check)
. Этот "%*c"
будет читать один символ из stdin
, а затем просто отбрасывать его, а затем "%c"
получит ваш ввод в переменную check
. Но если вы введете дополнительную новую строку или, скажем, будете иметь некоторые пробелы перед опциями, которые вы вводите, или после введенного вами числа, то это приведет к тому, что только один из них будет использован вышеуказанным и отброшен, и та же проблема возникнет.
Вы также можете использовать строку scanf (" %c", &check);
. " %c"
(обратите внимание на конечный пробел) пропускает любое количество пробелов, которые вы вводите перед вводом первого символа.
На самом деле это зависит от того, как вы хотите интерпретировать и обрабатывать ввод, вам нужно настроить его в соответствии с ним. Вероятно, сделайте:
char check[2];
while (status == 1)
{
sum += num;
printf("Do you wanna add more integer?(y/n) :"); //Asking for user next action
scanf("%s" , check);
if ((check[0] == 'y')&&(check[1] == '\0')) //Check user's answer
status = scanf("%d" , &num);
else
status = 0;
}
или просто используйте strcmp (check, "y") == 0
или другие способы.