0

我对 C 和编程还很陌生,而且我一直被卡住。我正在通过一个程序来练习,只是增加了它的复杂性。

与这里提出的其他一些问题相比,该程序相当简单。我要做的就是输入一个数字,然后说出它是小于还是大于五。我最近添加了一个菜单和一个 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.

我可以请我帮忙说明什么是错误的以及此错误消息的含义吗?

谢谢

4

3 回答 3

1

scanf()无法读取布尔数据类型。没有适当的格式说明符用于bool使用scanf().
请注意,scanf()如果使用格式说明符和实际数据类型之间的不匹配,则会导致Undefined Behavior

您将不得不使用int.

改变:

bool Determine = 1; 

int Determine = 1; 
于 2012-09-06T10:30:30.937 回答
0

抛弃 yoda 条件句,然后滚动

while(Determine)

这将完全像你写的那样工作,因为 C 没有布尔值,它们是整数。false 为 0,true 为非零。

如果内部参数大于零(非假),则 while、if、for 和所有这些都将触发。

另外,尝试在代码块之间使用 printf,这样您就知道卡在哪里了。我认为如果您更好地格式化代码,您会自己注意到错误(以及其中之一);)

阅读本文了解更多信息在 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,事物也不能自动将自己投射到其他事物上:)

于 2012-09-06T10:31:51.863 回答
-1

0 不等于 false,true 不等于 1。

将determine的数据类型从bool改为int

检查确定为确定 == 0 或 1。

于 2012-09-06T10:33:52.703 回答