2013-07-29 105 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);由此,它將在讀取數據後清除輸入緩衝區。

相關問題