运行时检查失败#2 - 变量'check'周围的堆栈已损坏

时间:2013-07-29 06:04:09

标签: c

我遇到了这个问题:运行时检查失败#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;

}

4 个答案:

答案 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()发信号通知您要跳过前导空格。如果不这样做,则会发生以下情况:

  1. 来自前一个提示Enter the resistance of Rheostat:的输入流中剩余的回车符将被视为输入字符。 check将被\n分配。

  2. 两个if条件都会失败; check既不是Y也不是yN也不是n

  3. 执行将返回while的{​​{1}}循环的顶部,该循环仍然为零。因此,将再次显示有关flagohm的适当值的输出,然后将再次显示led的提示。

  4. check将再次检查输入流,这次是读取用户输入的实际选择,并执行相应的操作。

  5. 通过在格式字符串中包含前导空格,您将避免此重复输出。

    更好的修复:每次调用scanf()后刷新输入缓冲区。定义一个宏:

    scanf()

    并在每次致电#define FLUSH while (getchar() != '\n') 后,输入scanf()。它更安全。

答案 3 :(得分:0)

它在代码块中对我来说很好.... 刷新缓冲区中的所有数据,即在读取数据输入缓冲区后刷新输入缓冲区 即scanf(“%d”,&amp; led);     fflush(标准输入); 这样,它将在读取数据后清除输入缓冲区。