2016-01-12 48 views
0

我有這個函數,我已經創建了一個問題,它已被創建爲最小化主函數中的代碼。 (我是教你應該在主函數代碼最小量)....雖然循環不停止在一個函數c

繼承人的代碼(生病之後解釋詳細的問題):

void startPrediction(struct TrieNode* root, struct TrieNode* pntr) 
{ 
    char result[50]; 
    char search[256]; 
    char exitProg[5]; 

    while(1) 
    { 
     memset(&result[0], 0, sizeof(result)); 
     memset(&search[0], 0, sizeof(search)); 
     memset(&exitProg[0], 0, sizeof(exitProg)); 

     while(strlen(search) == 0) 
     { 
      printf("Enter: "); 
      scanInput(search); 

      search[strcspn(search, "\n")] = 0; 

      if(strlen(search) == 0) 
       printf("Invalid Entry, Please Retry!\n"); 
     } 

     //check for a space in the word 
     removeSpaces(search); 

     removePunctuationAndSpecial(search); 

     trieSearch(root, &pntr, search, result); 

     printf("\n\n"); 

     wordSelectionDisplay(root, pntr, result); 

     printf("Would you like to exit?? (Y/N)\n"); 
     printf("Enter: "); 
     scanf("%s", exitProg); 

     if((exitProg[0] == 'Y') || (exitProg[0] == 'y')) 
     { 
      printf("Exiting...\n"); 
      return; 
     } 
     else 
      printf("Continuing Program...\n"); 
    } 
} 

所有這些代碼是罰款直到詢問用戶他們是否想退出...如果他們把Y/Y放在那裏,那麼它就會正常工作並退出,如果他們放置了N/n,那麼代碼將從while循環的頂部開始並通過但不停止在scanInput(search);函數中,其中只包含fgets(input, sizeof(input), stdin);行代碼...

它會越過它然後進入if語句並打印「無效輸入請重試」,然後才能正常運行,並等待用戶輸入東西...

沒有人有一個如何繞過這個錯誤的想法?

感謝

+0

不要使用'scanf()'。 –

+0

@iharob我沒有使用'fgets()'我只是調用了它在scanInput中的函數 – Jack

+0

哦,'while(strlen(search)== 0)'很簡單'while(* search =='\ 0') ',但沒有不必要的函數調用的開銷。再一次'if(* search == 0)...'。 –

回答

2

這是因爲scanf()輸入緩衝區離開'\n',當你再次調用該函數是簡單的回報爲,當用戶按下'\n',你可能會在年底做到這一點

int chr; 
while (((chr = getchar()) != EOF) && (chr != '\n')); 

的循環。