Когда я пытаюсь запустить без отладки код, все работает гладко, но как только я нажимаю Y, чтобы продолжить ввод чисел, он завершается (должен сказать, что мне нужна помощь)
int main() {
int a;
char c;
do {
puts("dwse mou enan arithmo: ");
scanf_s("%d", &a);
if (a > 0) {
if (a % 2 == 0)
printf("the number %d is even \n", a);
else
printf("the number %d is odd \n", a);
} else {
printf("the program won't run with negative numbers \n");
}
printf("if you want to proceed press y or Y :");
c = getchar();
getchar();
} while (c == 'y' || c == 'Y');
return 0;
}
Почти наверняка это обычная головная боль при смешивании scanf и getchar. scanf не использует новую строку после числа, поэтому c будет иметь значение '\n', которое не равно 'y' или 'Y'. Вместо этого используйте fgets для чтения целых строк за раз и преобразования текста в машинные номера с помощью strtol и его друзей.
Кроме того, такие функции, как scanf_s(), взяты из Приложения K стандарта C. Они не являются обязательными, поэтому их нельзя переносить. Мало того, это состояние приложения K: «мы предлагаем, чтобы Приложение K было либо исключено из следующей версии стандарта C, либо объявлено устаревшим, а затем удалено». Реализация Microsoft еще хуже: «В результате многочисленных отклонений от спецификации реализация Microsoft не может считаться соответствующей или переносимой».





Символ, прочитанный getchar(), - это незавершенный перевод строки, который был введен после числа, но не был использован scanf_s.
Вы должны использовать эту ожидающую новую строку перед чтением следующего символа для теста продолжения, что можно легко сделать в scanf с пробелом перед спецификацией преобразования %c:
#include <stdio.h>
int main() {
int a;
char c;
for (;;) {
printf("dwse mou enan arithmo: ");
if (scanf_s("%d", &a) != 1)
break;
if (a >= 0) {
if (a % 2 == 0)
printf("the number %d is even\n", a);
else
printf("the number %d is odd\n", a);
} else {
printf("the program does not accept negative numbers\n");
}
printf("if you want to proceed press y or Y: ");
if (scanf_s(" %c", &c) != 1 || (c != 'y' && c != 'Y'))
break;
}
return 0;
}
Оно работает!!! Большое спасибо за правильный код и за то, на что мне следует обратить внимание в следующий раз, когда я сделаю что-то подобное.
Какое значение имеет
c? Что, если вы добавите скобки к выражению для циклаdo-while?