【问题标题】:How to fix "Debug Error!, Stack around the variable 'x' was corrupted"?如何修复“调试错误!,变量'x'周围的堆栈已损坏”?
【发布时间】:2019-09-05 03:42:40
【问题描述】:

我真的是 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


    【解决方案1】:

    这是一个非常很大的问题:

    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");
    }
    

    另外需要注意的是,我在输出中使用了 trailing 换行符。那是因为否则程序完成后可能没有换行符(因此输出似乎与命令行提示混合在一起),而且还因为默认情况下输出到stdoutprintf 写入)是 行缓冲。行缓冲意味着输出在内部被缓冲,直到缓冲区已满,或写入换行后才会真正写入终端。如果您在输出中使用前导换行符,则将写入前一行,而不是当前行。

    【讨论】:

    • 也谢谢你:)!。我正在使用 Jetbrain 的 CLion 和学生许可证。
    【解决方案2】:

    到目前为止,您正在使用 %s 说明符来读取 char。 您需要使用%c 说明符来读取char%s 用于char *

      scanf(" %c", &manOrFemale);
    

    您需要使用单引号来比较chars。到目前为止,您正在比较 char 带指针。

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

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2012-11-08
      • 2019-09-04
      相关资源
      最近更新 更多