首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行时检查失败#2 -变量' Check‘周围的堆栈已损坏。

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

Stack Overflow用户
提问于 2013-07-29 06:04:08
回答 4查看 3.2K关注 0票数 0

我面临过这样的问题:运行时检查失败#2 -堆在变量' Check‘周围的代码在visual studio 12中被破坏。我也在代码库中尝试过这一点,但也面临着同样的问题。我也在ideone.com中运行我的代码,它显示运行时错误。它适用于Y,但不适用于N

int main() {

代码语言:javascript
复制
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;

}

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-29 07:21:52

在语句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,也不是Nn
  3. 执行将返回到while循环的顶部,对于flag,它仍然是零。因此,有关ohmled的适当值的输出将再次显示,然后将再次显示check提示符。
  4. scanf()将再次检查输入流,这一次读取用户输入的实际选择,并执行适当的操作。

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

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

代码语言:javascript
复制
#define FLUSH while (getchar() != '\n')

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

票数 2
EN

Stack Overflow用户

发布于 2013-07-29 06:06:44

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

票数 2
EN

Stack Overflow用户

发布于 2013-07-29 06:06:41

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

代码语言:javascript
复制
scanf("%1s", check);

因为您正在保存一个字符串(终止\0),所以您应该使用一个更大的变量:

代码语言:javascript
复制
char check[2];

编辑:但是是的,当输入仅仅是一个字符时,scanf("%c",&check)要好得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17917029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档