2016-04-05 45 views
2

我試圖做一個C程序出了Cows and Bulls game word版String value =「clay」自動更改爲「/ 000lay」?

這裏是我的代碼: -

#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
    char word[4],guess[4]; 
    int i,j,check=0,b=0,c=0,d[4]; 
    system("cls"); 
    printf("Welcome to the Cows and Bulls game!\n\nEnter a 4 letter word to be guessed :- "); 
    scanf("%s",word); 
    while(check==0) 
    { 
     printf("\nEnter your guess :- "); 
     scanf("%s",guess); 
     for(i=0;i<4;i++) 
     { 
      for(j=0;j<4;j++) 
      { 
       if(i==j && word[i]==guess[j]) 
       { 
        b++; 
        d[j]=j; 
        break; 
       } 
       else if(word[i]==guess[j] && j!=d[j]) 
       { 
        c++; 
        break; 
       } 
      } 
     } 
     printf("%d cow(s) and %d bull(s)!\n",c,b); 
     if(b==4) 
     { 
      printf("Congratulations! You have correctly guessed %s",word); 
      check=1; 
     } 
     else 
     { 
      check=0; 
     } 
    } 
    getch(); 
} 

但我是假設有問題我把這個詞「土」被猜測但只要編譯器接受猜測詞的值,先前給出的「粘土」一詞就變成了「/ 000lay」,這完全是該程序的一個固定。我可以在調試時看到這一點。

Here's the image

這究竟是爲什麼?任何幫助表示讚賞!

+1

另一個bean計數器:)除非你處於一個內存不足的嵌入式環境中否則不要爲文本聲明微小的緩衝區。只要把[256]作爲最低限度。 –

回答

5

最後,您不會爲NUL終結符('\0')保留空間,當輸入大於或等於4個字符時,最終通過scanf調用未定義行爲。更改

char word[4],guess[4]; 

char word[5], guess[5]; 

其他建議和意見:

  • system需要stdlib.h。包括它。
  • conio.h(和getch)是非標準的。
  • void main()不是main的標準簽名。改爲使用int main(void)。您還需要在main末增加return 0;(這是C99 +隱性)
  • 相反的scanf("%s",word);,使用

    if(1 != scanf("%4s", word)) /* Check if `scanf` is successful; The `4` prevents buffer overflows */ 
    { 
        fputs("scanf for word failed; Exiting...", stderr) 
        exit(-1); 
    } 
    

    ,同樣爲scanfguess

  • 最好初始化所有變量。
+0

你是一個救星,我是一個神啊!非常感謝你:) –

+0

但爲什麼沒有發生猜測變量呢? –

+0

@MihirKandoi未定義的行爲意味着任何事情都可能是結果。 UB襲擊時,你無法確定任何事情。 –

相關問題