Как исправить «Ошибка отладки !, стек вокруг переменной« x »был поврежден»? - PullRequest
0 голосов
/ 15 апреля 2019

Я действительно новичок в языке C и тестировал простую программу if-Statement, которая, исходя из вашего возраста и пола, дает один ответ из 4 разных результатов.

Что выглядит примерно так: Если вам меньше 55 лет и вы мужчина, на нем будет напечатано: «Вы мужчина в его лучшем возрасте!»

Но я сталкиваюсь с кодом ошибки, который говорит: Ошибка проверки времени выполнения # 2 - стек вокруг переменной 'miesVaiNainen' поврежден.

Я сам, думаю, это как-то связано с: if (manOrFemale == "f" && age <= 55)

Как я могу исправить эту проблему, чтобы ошибка не возникала?

Я пытался искать помощь в stackoverflow и много пытался изменить код.

    int age;
    char manOrFemale;

    printf("Are you a man or a female(m/f)");
    scanf("%s", &manOrFemale);

    printf("Input age:");
    scanf("%d", &age);

    if (manOrFemale == "f" && age <= 55)
    {
        printf("\nYou are a lady at her best!");
    } else if (manOrFemale == "f" && age >= 56)
    {
        printf("\nYou look young for your age!");
    }


    if (manOrFemale == "m" && age <= 55)
    {
        printf("\nYou are a man at his best age!");
    } else if (manOrFemale == "m" && age >= 56)
    {
        printf("\nYou are a wise man!");
    } else {
        printf("There has been an error in the program!");
    }
}

Ответы [ 2 ]

3 голосов
/ 15 апреля 2019

На данный момент вы используете спецификатор %s для чтения char. вам нужно использовать спецификатор %c для чтения char, %s для char *.

  scanf(" %c", &manOrFemale);

И

вам нужно использовать одинарные кавычки для сравнения chars. На данный момент вы сравниваете char с указателем.

if (manOrFemale == 'f'; && age <= 55)
2 голосов
/ 15 апреля 2019

Вот очень большая проблема :

scanf("%s", &manOrFemale);

Переменная manOrFemale представляет собой один символ.Формат "%s" предназначен для чтения байтовых строк с нулевым символом в конце.

Строка, состоящая только из одного символа, требует пространства для двух символов, чтобы соответствовать нулевому ограничителю.Поскольку у вас нет места для терминатора, функция scanf запишет в память, которой вы не владеете, что приведет к засорению стека (где компиляторы обычно хранят локальные переменные), что приведет к получаемой ошибке.

Если вы хотите прочитать один символ, а затем использовать формат "%c", как в

scanf(" %c", &manOrFemale);

Обратите внимание на начальный пробел в строке формата, необходимо игнорировать возможный начальный пробел (например, перевод строки)из любого предыдущего ввода).


Также обратите внимание, что при сравнении manOrFemale == "f" вы сравниваете один символ в manOrFemale со строкой "f".Литеральная строка в C на самом деле является массивом символов только для чтения, и, как и любой другой массив, она распадается на указатель на свой первый элемент.Таким образом, вы не сравниваете символы, вы сравниваете символ с указателем.

Ваш компилятор должен был предупредить вас об этом.

Чтобы решить эту проблему, необходимо сравнить с одним символом.вместо: manOrFemale == 'f'.Обратите внимание на использование одинарных кавычек.


Наконец, более стилистическая заметка ...

Заявления

if (manOrFemale == 'f' && age <= 55)
{
    printf("\nYou are a lady at her best!");
} else if (manOrFemale == 'f' && age >= 56)
{
    printf("\nYou look young for your age!");
}

могут быть переписаны как

if (manOrFemale == 'f')
{
    if (age <= 55)
        printf("You are a lady at her best!\n");
    else
        printf("You look young for your age!\n");
}

Еще одна вещь, на которую следует обратить внимание, это то, что я использую трейлинг перевод строки в выводе.Это связано с тем, что в противном случае после завершения программы может отсутствовать символ новой строки (поэтому вывод кажется смешанным с приглашением командной строки), а также потому, что по умолчанию вывод stdout (при записи printf) линия буферизации .Буферизация строки означает, что вывод буферизуется внутренне и фактически не записывается в терминал до тех пор, пока либо не заполнится буфер, либо , либо не будет написана новая строка .Если в выходных данных вы используете начальные символы новой строки, будет записана предыдущая строка, а не текущая.

...