如何修复“调试错误!,变量'x'周围的堆栈已损坏”?

问题描述 投票:0回答:2

我是C语言的新手,正在测试一个简单的if语句程序,根据你的年龄和性别从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!");
    }
}
c if-statement char
2个回答
3
投票

截至目前,您正在使用%s说明符来阅读char。你需要使用%c说明符来读取char%s是用于char *

  scanf(" %c", &manOrFemale);

你需要使用单引号来比较chars。截至目前,您正在将char与指针进行比较。

if (manOrFemale == 'f'; && age <= 55)

2
投票

这是一个非常大的问题:

scanf("%s", &manOrFemale);

变量manOrFemale是单个字符。格式"%s"用于读取以null结尾的字节字符串。

只有一个字符的字符串需要两个字符的空间,以适应空终止符。由于你没有终结器的空间,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");
}

这里要注意的另一件事是我在输出中使用尾随换行符。这是因为否则在程序完成后可能没有换行符(因此输出似乎与命令行提示混合),但也因为输出到stdoutprintf写入)默认是行缓冲的。行缓冲意味着输出在内部缓冲,并且在缓冲区已满或写入换行符之前不会实际写入终端。如果在输出中使用前导换行符,则将写入上一行,而不是当前行。

热门问题
推荐问题
最新问题