我遇到了这个问题:运行时检查失败#2 - Visual Studio 12中变量'check'周围的堆栈已损坏。我也在codeblock中尝试这个但面临同样的问题。我也在ideone.com中运行我的代码,它显示运行时错误。它适用于Y但不适用于N
int main() {
int led=0;
int ohm=0;
char check;
int flag=0;
while (led < 1 || led > 3){
printf("Enter the number of switch you want to close: \n\n");
printf(" ******************** Press 1 for switch (LED) 1 ********************\n");
printf(" ******************** Press 2 for switch (LED) 2 ********************\n");
printf(" ******************** Press 3 for switch (LED) 3 ********************\n");
printf("Switch: ");
scanf("%d", &led);
}
printf("\n\n");
while (ohm < 1 || ohm > 3){
printf("Enter the resistance of Rheostat: \n\n");
printf(" ******************** Press 1 for 10 ohm resistance ********************\n");
printf(" ******************** Press 2 for 20 ohm resistance ********************\n");
printf(" ******************** Press 3 for 30 ohm resistance ********************\n");
printf("Resistance: ");
scanf("%d", &ohm);
}
while (flag == 0)
{
//LED-1
if(led== 1 && ohm== 1 )
{
printf("LED-1 is blinking 2 times\n");
}
if(led== 1 && ohm== 2)
{
printf("LED-1 is blinking 4 times\n");
}
if(led== 1 && ohm== 3 )
{
printf("LED-1 is blinking 6 times\n");
}
//LED-2
if(led== 2 && ohm== 1 )
{
printf("LED-2 is blinking 2 times\n");
}
if(led== 2 && ohm== 2 )
{
printf("LED-2 is blinking 4 times\n");
}
if(led == 2 && ohm == 3)
{
printf("LED-2 is blinking 6 times\n");
}
//LED-3
if(led == 3 && ohm == 1 )
{
printf("LED-3 is blinking 2 times\n");
}
if(led == 3 && ohm == 2)
{
printf("LED-3 is blinking 4 times\n");
}
if(led == 3 && ohm == 3)
{
printf("LED-3 is blinking 6 times\n");
}
printf("Do you want to continue Yes (Y) or No (N): ");
scanf("%s", &check);
if(check =='Y' || check =='y')
{
led = 0;
ohm = 0;
while (led < 1 || led > 3){
printf("Enter the number of switch you want to close on: ");
scanf("%d", &led);
}
while (ohm < 1 || ohm > 3){
printf("Enter the resistance of Rheostat: ");
scanf("%d", &ohm);
}
}
if(check=='N' || check=='n')
{
printf("Thanks for using the program");
flag = 1;
}
}
return 0;
}
答案 0 :(得分:2)
scanf("%s", &check);
而不是字符串时, scanf("%c", &check);
应为char
。
答案 1 :(得分:1)
问题是你的变量“check”太小了。
scanf("%1s", check);
因为要保存字符串(终止\ 0),所以应该使用更大的变量:
char check[2];
编辑:但是,如果输入只有一个字符,则scanf(“%c”,&amp; check)要好得多。
答案 2 :(得分:1)
在语句scanf ("%s", &check);
中,您正在尝试扫描字符串并将其填充到字符中。有几种方法可以解决这个问题:
快速修复:将scanf("%s", &check)
替换为scanf (" %c", &check)
。请注意格式字符串中的空格:" %c"
,而不仅仅是"%c"
。 %c
格式说明符不会跳过前导空格,因此您必须在格式字符串中的%c
之前包含空格,以明确向scanf()
发信号通知您要跳过前导空格。如果不这样做,则会发生以下情况:
来自前一个提示Enter the resistance of Rheostat:
的输入流中剩余的回车符将被视为输入字符。 check
将被\n
分配。
两个if
条件都会失败; check
既不是Y
也不是y
,N
也不是n
。
执行将返回while
的{{1}}循环的顶部,该循环仍然为零。因此,将再次显示有关flag
和ohm
的适当值的输出,然后将再次显示led
的提示。
check
将再次检查输入流,这次是读取用户输入的实际选择,并执行相应的操作。
通过在格式字符串中包含前导空格,您将避免此重复输出。
更好的修复:每次调用scanf()
后刷新输入缓冲区。定义一个宏:
scanf()
并在每次致电#define FLUSH while (getchar() != '\n')
后,输入scanf()
。它更安全。
答案 3 :(得分:0)
它在代码块中对我来说很好.... 刷新缓冲区中的所有数据,即在读取数据输入缓冲区后刷新输入缓冲区 即scanf(“%d”,&amp; led); fflush(标准输入); 这样,它将在读取数据后清除输入缓冲区。