2012-05-10 86 views
1

以下是我的C代碼。C程序的奇怪行爲

#include<stdio.h> 
#include<stdlib.h> 

int main() 
{ 
    int ch; 

    do 
    { 
     printf("\n1.create\n2.display\n3.exit\n\t"); 
     printf("Enter your choice:: "); 
     scanf("%d",&ch); 
     printf("choice = %d\n\n", ch); 
     if(ch==32767) 
      return 0; 
     switch(ch) 
     { 
      case 1: 
       printf("\n Case 1 executed\n"); 
       break; 
      case 2: 
       printf("\nCase 2 executed\n"); 
       break; 
      case 3: 
       printf("\nExit\n"); 
       exit(0); 
       break; 
      default: 
       printf("Wrong choice!!!"); 
       break; 

     } 
    }while(ch!=3); 
    return 0; 
} 

問題是,當我爲ch輸入整數值時它工作正常。 但是,當我輸入任何字符時,它將以無限循環運行。

任何人都可以解決它。

+4

運行它通過一個調試器,然後回到這裏,如果你不明白髮生了什麼。如果你在Linux上,我會推薦GDB ... –

+0

@Prabin你爲什麼要輸入'ch'作爲整數類型?您稍後需要該號碼進行進一步處理嗎?如果否,那麼使用'int'解析非嚴格整數輸入可能不是最好的解決方案。如果你需要'switch-case'以外的值,那麼將輸入字符/字符串作爲選項,然後在正確輸入的情況下提取整數值?在任何情況下,我強烈建議在可能的非數字輸入情況下不要使用_only_「int」類型輸入。 – penelope

回答

-2

使用scanf ("%*[^\n]\n");

在這裏,你已經使用的scanf( 「%d」,& CH);它將正確讀取整數值,但只要您給出除整數之外的任何值,它將終止或顯示不同的輸出。 Why this is happening ? @它happning因爲每次你進入關於scanf函數的一些值有效或無效首先它發生在輸入緩衝區讀寫器進行閱讀該值後..

如需進一步信息:http://en.wikipedia.org/wiki/Scanf_format_string

#include<stdio.h> 
#include<stdlib.h> 

int main() 
{ 
    int ch; 

    do 
    { 
     printf("\n1.create\n2.display\n3.exit\n\t"); 
     printf("Enter your choice:: "); 

     scanf ("%*[^\n]\n"); 
     scanf("%d",&ch); 
     switch(ch) 
     { 
      case 1: 
       printf("\n Case 1 executed\n"); 
       break; 
      case 2: 
       printf("\nCase 2 executed\n"); 
       break; 
      case 3: 
       printf("\nExit\n"); 
       exit(0); 
       break; 
      default: 
       printf("Wrong choice!!!"); 
       break; 

     } 
    }while(ch!=3); 
    return 0; 
} 
+0

Hi Nishant,感謝您發佈答案。運行此代碼後發現問題。當它要求輸入時,我插入的字符顯示爲空白。再次如果我輸入一個字符它工作正常。你能修好它嗎。 – Prabin

+0

此代碼無法使用。例如:嘗試輸入'j1E''jE''1E''jE',其中'E'代表輸入鍵。每次輸入後會發生什麼:nothing,wrong_choice,case_1,case_1。我不認爲這是一個理想的行爲。我錯了嗎? – penelope

+0

這個答案有點令人誤解:模式「%* [^ \ n]」會丟棄之前的所有內容(不包括)換行符。如果在換行符之前什麼也沒有,它就會失敗,下一個模式將不會被執行。如果在換行符之前有某些內容被丟棄,然後執行「\ n」,這將丟棄每個空格字符直到非空白字符。如果在換行符「scanf」將掛起期望之後沒有任何非空白字符 – IanC

2

如果您希望能夠處理字符,則應該使用char值而不是int

在這種情況下,您還必須修改您的switch-case聲明,因爲'1'-字符與1-整數不同。更正後的代碼應該是這樣的:

#include <limits.h> 

int main() 
{ 
    char ch; 

    do 
    { 
     printf("\n1.create\n2.display\n3.exit\n\t"); 
     printf("Enter your choice:: "); 
     scanf("%c",&ch); 
     printf("choice = %c\n\n", ch); 
     switch(ch) 
     { 
      case '1': 
       printf("\n Case 1 executed\n"); 
       break; 
      case '2': 
       printf("\nCase 2 executed\n"); 
       break; 
      // case 32767: - can not be stored in a char variable 
      case 127: 
      case CHAR_MAX: // these two are almost equivalent, but the 
          // second one is better because it relies on 
          // library defined constant from limits.h 
      case '3': 
       printf("\nExit\n"); 
       exit(0); 
       break; 
      case 'a': 
       printf("\nA character case accepted!\n"); 
       break; 
      default: 
       printf("Wrong choice!!!"); 
       break; 

     } 
    }while(); 
    return 0; 
} 

注意,我也爲while()參數排除的休息條件,因爲它是多餘的 - 它已經switch語句內進行檢查。

我還添加了一個解析字符的非錯誤案例,以便您可以看到該示例。

另外一個說明:您的舊代碼應該同時接受011作爲一個有效的選擇,而新代碼將解析01作爲兩個不同的選擇(1個選擇== 1個字符):

  • 0會被解析爲一個錯誤的選擇
  • 1會被解析爲一個正確的選擇。情況1

我也談到一些其他的事情與Y我們的代碼中的代碼評論在更正後的代碼片段中。如果像Jerry Coffin在評論中指出的那樣,我拿出了「不可能的」,並把它放在一個更合適的位置,用一個有意義的東西代替常量。

+0

現在你寵壞了所有的樂趣:-) –

+0

至少在大多數系統(其中CHAR_MAX = 127或255)與32767的比較不可能是真實的。 –

+0

@Fredrik這是真的,我通常不回答這種類型的問題與代碼回覆......今天感覺特別好:) – penelope