我对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.
我可以得到一些帮助,说明哪里出了问题,以及这个错误消息的含义吗?
感谢
scanf()
无法读取布尔数据类型。使用scanf()
读取bool
时没有合适的格式说明符
请注意,在使用scanf()
时,如果格式说明符和实际数据类型不匹配,则会导致未定义的行为。
您必须使用int
。
更改:
bool Determine = 1;
至
int Determine = 1;
放弃yoda条件,只使用
while(Determine)
这将和你写的完全一样,因为C没有布尔,它们是int。false为0,true为非零。
而如果里面的参数大于零(非false),则if、for和所有这些都将触发。
此外,试着在代码块之间使用printf,这样你就知道自己在哪里被卡住了。我想如果你把代码格式化得更好一点,你会自己注意到这个bug(好吧,其中之一);)
阅读此了解更多信息在C 中使用布尔值
编辑:哦,好吧。
bool Determine = 1; //not even true or false here you're using it as an int
然后是
scanf("%d", &determine);
布尔应该只有一个字节,整数是四个字节;如果将4个字节插入1个字节的区域,bam堆栈就会损坏。
int Determine = 1;
你需要注意数据的大小,使用sizeof()来感受事情有多大。即使这是C:)
0不等于false,true不意味着1。
将determine的数据类型从bool 更改为int
检查确定为确定==0或1。