2014-11-08 61 views
0
#include <stdio.h> 
    #include <stdlib.h> 
    #include <ctype.h> 
    #include <string.h> 
    int compare(char word[], char mystery[]) 
    { 
     int i=0;int bool=1; 
     while((i<=20)&&(bool==1)) 
     { 
      if (word[i]==mystery[i]) 
       i++; 
      else 
       bool=0; 
     } 
     return bool; 
    } 
    char readCharacter() 
    { 
     char character = 0; 

     character = getchar(); 
     character = toupper(character); 
     while (getchar() != '\n') ; 
     return character; 
    } 
    void readString(char *word,char *mystery) 
{ 
    int i=0; 
    printf("Enter the word to guess : "); 
    scanf("%s",word); 
    while(*((word)+(i)) != '\0') 
    { 
     *((word)+(i))= toupper(*(word+i)); 
     *((mystery)+(i))='*'; 
     i++; 
    } 
    *(mystery+i)='\0'; 
} 
void process(char *word,char *mystery,char letter,int *change) 
{ 
    int i=0; 
    while (*((word)+(i))!= '\0') 
    { 
     if (*((word)+(i))==letter) 
     { 
      *((mystery)+(i))=letter; 
      *change=1; 
     } 
     i++; 

    } 

} 
    void test(char *word,char *mystery, int triesleft) 
    { 
     if (*mystery!=*word) 
      { 
       printf("The mystery word is : %s",*mystery); 
       printf("\n You have %d tries left.", triesleft); 
      } 
     else 
     { 
       printf("You won !"); 
     } 
    } 
    int main() 
    { 
     int triesleft = 10; int change=0; 
     char word[20]; char mystery[20];char letter; 
     readString(&word,&mystery); 
     while((compare(word,mystery)==0) && (triesleft>0)) 
     { 
      change=0; 
      printf("Enter the letter :"); 
      letter=readCharacter(); 
      process(&word,&mystery,letter,&change); 
      if ((change)==1) 
       triesleft--; 
      test(&word,&mystery,triesleft); 
     } 
     if (triesleft>0) 
      return 0; 
     printf("You lost."); 
     return 1; 

    } 

我是C初學者,我想用C語言編寫一個簡單的Hang子手遊戲,它編譯的很好,但它似乎在輸入第一個字母后崩潰,我找不到解決方案! 我不知道可能是什麼原因,但我有很多的使用字符串用C麻煩,因爲它們不存在,也許那是一個糟糕的操作我不知道:/程序崩潰,無法解釋爲什麼?

+1

你的程序沒有「編譯好」,出現了大量的警告。確保你打開你的編譯器的警告設置並修復它們。另外,開始變小。如果你在第一個函數調用時編寫了崩潰,除非你明白問題是什麼,否則將其他所有東西都去掉並且簡化這個函數(讓它做更少的事情)。 – Mat 2014-11-08 07:39:12

+0

請指出它發生崩潰的位置,並顯示錯誤消息 – Eric 2014-11-08 07:39:19

+0

此行有問題。 '而(第(i <= 20)&&(布爾== 1))'。對於包含'20'項的數組,最高有效索引是'19',而不是'20'。 – 2014-11-08 07:41:31

回答

1

您首先調用readString就足以使程序崩潰。

wordmystery是數組,所以&wordchar **不是char *。你應該使用

readString(word, mystery); 

但編譯器應該有問題的警告。警告不是爲了分散初學者的注意力,以表示可能(如果你不瞭解警告的話可能會出現)錯誤。

以後可能還有其他問題...

+0

修復並警告和程序不會崩潰了。剩下的問題只是現在起作用。 – Lakouz 2014-11-08 08:00:53

0

readString()函數,您應該使用'\ 0'而不是NULL,因爲C字符串以此字符結尾。

+0

謝謝。我現在沒有,如果它只是0或NULL或其他東西:) – Lakouz 2014-11-08 08:01:35

+0

很高興我是有幫助的。並且,只要您找到有用的答案,請做出積極的努力。 – 2014-11-08 08:03:00

+0

我試過了,它說我沒有足夠的聲望來這樣做>< – Lakouz 2014-11-08 08:05:01

0

您不能聲明名爲bool的變量,因爲它是一個類型。在C中,它並沒有爲所有編譯器實際定義,因爲bool不是標準的一部分,但是一些編譯器和一些平臺將無論如何定義它。

+1

只有當你包含'stdbool。 h',那將是一個很難編譯的錯誤。 – Mat 2014-11-08 07:44:12

+0

也有可能這不是實際的C,而是編譯爲C++ – Eric 2014-11-08 07:44:49

+0

該代碼不會編譯爲C++。 OP說它編譯。 – Mat 2014-11-08 07:45:43