0

我遇到了这个问题:运行时检查失败 #2 - 在 Visual Studio 12 中,变量“检查”周围的堆栈已损坏。我也在代码块中尝试过这个,但遇到了同样的问题。我也在 ideone.com 中运行我的代码,它显示运行时错误。IT 适用于 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

4 回答 4

2

scanf("%s", &check);应该是scanf("%c", &check);当你阅读一个char不是字符串的时候。

于 2013-07-29T06:06:44.087 回答
2

在语句中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也不是y,既不是N也不是n

  3. while执行将返回到for 循环的顶部flag,它仍然为零。因此,关于 和 的适当值的输出ohmled再次显示,然后再次显示提示check

  4. scanf()将再次检查输入流,这次读取用户输入的实际选择,并做适当的事情。

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

更好的解决方法:在每次调用scanf(). 定义一个宏:

#define FLUSH while (getchar() != '\n')

并在每次调用 后scanf(),键入FLUSH;。这安全多了。

于 2013-07-29T07:21:52.783 回答
1

问题是您的变量“检查”太小了。

scanf("%1s", check);

因为您要保存一个字符串(以 \0 结尾),所以您应该使用一个更大的变量:

char check[2];

编辑:但是,如果输入只有一个字符,scanf("%c", &check) 会好得多。

于 2013-07-29T06:06:41.943 回答
0

它在代码块中对我来说工作正常....刷新缓冲区中的所有数据,即在读取数据输入缓冲区之后刷新输入缓冲区,即 scanf(" %d", &led); 刷新(标准输入);这样,它将在读取数据后清除输入缓冲区。

于 2013-07-29T07:07:38.417 回答