2013-07-29 97 views
0

我遇到了这个问题:运行时检查失败#2 - 变量“检查”周围的堆栈在Visual Studio 12中损坏。我也在代码块中尝试这个,但面临同样的问题。我也在ideone.com上运行我的代码,它显示运行时错误。它的工作原理用于Y,但亘古不变的作品对于N运行时检查失败#2 - 围绕变量“检查”的堆栈已损坏

INT主要(){

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

'scanf(“%s”,&check);'为什么你要将字符串加载到'char'中? [看看什么是'什么'和'c'是](http://msdn.microsoft.com/en-us/library/6ttkkkhh(v = vs.80).aspx)。 –

+1

请不要打扰使用'scanf'。 http://www.c-faq.com/stdio/scanfprobs.html – jamesdlin

回答

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

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

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

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

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

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

和每次调用scanf(),类型FLUSH;后。它更安全。

1

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

scanf("%1s", check); 

因为要保存一个字符串(带终端\ 0),你应该使用较大的变量:

char check[2]; 

编辑:但是,是的,scanf函数( “%C”,&检查)远如果输入只有一个单个字符,则效果更好

+0

-1易受溢出。如果我输入“否”,该怎么办? –

+0

+1更好。 –

+0

你不应该也不会。 :) – bkausbk

2

scanf("%s", &check);应该是scanf("%c", &check);当你读char不是字符串。

+0

自从我使用'scanf'后, %c'可能最终会从其他问题中读取尾部的\ n。 –

+0

事情是当我使用'scanf(“%c”,&检查);'它键入这条线两次'printf(“你想继续是(Y)还是没有(N):”);' 和我不知道为什么 – user2625486

0

及其在代码块为我工作细.... 读取数据输入缓冲器刷新输入缓冲器之后冲洗从缓冲区即所有数据 即scanf的(“%d”,&导致); fflush(stdin); fflush(stdin);由此,它将在读取数据后清除输入缓冲区。

相关问题