Do-While循环的“运行时检查失败#2”

时间:2012-09-06 10:26:58

标签: c loops while-loop boolean

我是C和编程的新手,我一直陷入困境。我正在练习一个程序,只是增加了它的复杂性。

与此处提出的其他一些问题相比,该计划相当简单。我想要做的就是输入一个数字,然后说出它是否小于或大于5。我最近添加了一个菜单和一个Do While循环。这是下面的代码。

#include <stdio.h>

void main ()
{
    int ANumber;
    bool Determine = 1; 
    int MenuChoice; 

    printf("1) Enter a number." "\n2) Exit.\n");
    printf("\nPlease choose an option from the menu above - ");

    scanf("%d", &MenuChoice);       

    if (1 == MenuChoice) {  

        do {
            printf("\nPlease enter a number that is between 0 and 10 - ");
            scanf("%d", &ANumber);          

            if (ANumber == 5)   
                printf("The number you entered is 5.\n");           

            if (ANumber >= 6)
                printf("The number you entered is larger than 5.\n");

            if (ANumber <= 4)
                printf("The number you entered is smaller than 5.\n");

            getchar();
            printf("Would you like to continue? 1 = Yes OR 0 = No - ");     
            scanf("%d", &Determine);    
            return;

        } while (true == Determine);

        if (false == Determine) {   
            return;
        }

    }

    if (2 == MenuChoice)
        return;
}

主要问题是大部分代码都运行良好 当我想退出循环时出现问题:

while (true == Determine);

if (false == Determine) {   
    return;
}

当我在程序中输入0时,会出现此错误:

Run-Time Check Failure #2 - Stack around the variable 'Determine' was corrupted.

我可以请一些帮助来说明错误以及此错误消息的含义吗?

由于

3 个答案:

答案 0 :(得分:1)

scanf()无法读取布尔数据类型。使用bool阅读scanf()没有合适的格式说明符 请注意,如果格式说明符与实际数据类型不匹配,则使用scanf()时会导致未定义行为

您必须使用int

改变:

bool Determine = 1; 

int Determine = 1; 

答案 1 :(得分:0)

抛弃yoda条件,然后滚动

while(Determine)

这将与您所写的完全一样,因为C没有布尔值,它们是整数。 false为0,true为非零。

同时,如果内部的参数大于零(非假),if,for和all将触发。

此外,尝试在代码块之间使用printf,以便您知道卡在哪里。如果您更好地格式化代码,我想你会自己注意到这个bug(其中一个是em);)

阅读本文以获取更多信息Using boolean values in C

编辑: 哦,好吧。

bool Determine = 1; //not even true or false here you're using it as an int

然后再

scanf("%d", &determine);

bool应该只是一个字节,整数是四个字节;你将4个字节堵塞到1字节区域,bam堆栈被破坏。

int Determine = 1;

您需要处理数据大小,使用sizeof()来了解有多大的事情。事情不能自动地转化为其他事物,即使这是C:)

答案 2 :(得分:-1)

0不等于false,而true并不代表1。

将bool的数据类型更改为int

选中确定为确定== 0或1。