Мой do-while завершается вместо продолжения моей программы на C

Когда я пытаюсь запустить без отладки код, все работает гладко, но как только я нажимаю 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;
}

Какое значение имеет c? Что, если вы добавите скобки к выражению для цикла do-while?

Scott Hunter 13.11.2018 22:03

Почти наверняка это обычная головная боль при смешивании scanf и getchar. scanf не использует новую строку после числа, поэтому c будет иметь значение '\n', которое не равно 'y' или 'Y'. Вместо этого используйте fgets для чтения целых строк за раз и преобразования текста в машинные номера с помощью strtol и его друзей.

zwol 13.11.2018 22:03

Кроме того, такие функции, как scanf_s(), взяты из Приложения K стандарта C. Они не являются обязательными, поэтому их нельзя переносить. Мало того, это состояние приложения K: «мы предлагаем, чтобы Приложение K было либо исключено из следующей версии стандарта C, либо объявлено устаревшим, а затем удалено». Реализация Microsoft еще хуже: «В результате многочисленных отклонений от спецификации реализация Microsoft не может считаться соответствующей или переносимой».

Andrew Henle 13.11.2018 22:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Символ, прочитанный 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;
}

Оно работает!!! Большое спасибо за правильный код и за то, на что мне следует обратить внимание в следующий раз, когда я сделаю что-то подобное.

istyl 13.11.2018 22:26

Другие вопросы по теме