【问题标题】:Run-Time Check Failure #2 - Stack around the variable 'check' was corrupted运行时检查失败 #2 - 变量“检查”周围的堆栈已损坏
【发布时间】:2013-07-29 06:04:08
【问题描述】:

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

}

【问题讨论】:

标签: c


【解决方案1】:

scanf ("%s", &amp;check); 语句中,您尝试扫描字符串并将其填充到字符中。有几种方法可以解决此问题:

快速修复:将scanf("%s", &amp;check) 替换为scanf (" %c", &amp;check)。注意格式字符串中的空格:" %c",而不仅仅是"%c"%c 格式说明符不会跳过前导空格,因此您必须在格式字符串中的 %c 之前包含空格,以明确向 scanf() 发出您想要跳过前导空格的信号。如果不这样做,则会发生以下情况:

  1. 上一个提示Enter the resistance of Rheostat: 在输入流中留下的回车符将作为输入字符。 check 将分配给 \n

  2. if 两个条件都将失败; check 既不是Y 也不是y,既不是N 也不是n

  3. 对于flag,执行将返回到while 循环的顶部,该循环仍为零。所以ohmled的适当值的输出将再次显示,然后check的提示将再次显示。

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

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

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

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

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

【讨论】:

    【解决方案2】:

    scanf("%s", &amp;check); 应该是 scanf("%c", &amp;check);,因为您读取的是 char 而不是字符串。

    【讨论】:

    • 自从我使用scanf 已经很久了,但我认为%c 可能最终会从其他问题中读取尾随\n
    • 问题是当我使用scanf("%c", &amp;check); 时,它会输入两次printf("Do you want to continue Yes (Y) or No (N): "); 这行,我不知道为什么
    【解决方案3】:

    问题是你的变量“check”太小了。

    scanf("%1s", check);
    

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

    char check[2];
    

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

    【讨论】:

    • 你不应该也不能。 :)
    • 问题是当我使用scanf("%c", &amp;check);它键入此行两次printf("Do you want to continue Yes (Y) or No (N): ");,我不知道为什么
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-21
      • 2013-12-13
      • 2013-12-10
      • 2015-02-09
      • 2015-05-24
      • 2021-12-31
      • 2014-10-20
      • 2014-07-01
      相关资源
      最近更新 更多