2014-11-08 2 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로 간단한 교수형 게임을 코드하고 싶지만 잘 컴파일되었지만 첫 글자를 입력 한 후 충돌이 발생하여 해결책을 찾을 수 없다! 무엇이 원인인지 모르겠지만 C에서 문자열을 사용하는 데 많은 어려움을 겪었습니다. 아마도 존재하지 않기 때문에 아마도 모르겠다는 조작을 잘못했을 수도 있습니다./프로그램 충돌, 이유를 설명 할 수 없습니까?

+1

프로그램이 "잘 컴파일되지 않습니다"라는 경고가 발생합니다. 컴파일러의 경고 설정을 켜고 모두 수정했는지 확인하십시오. 또한 작게 시작하십시오. 첫 번째 함수 호출에서 충돌을 프로그램하는 경우 문제가 무엇인지 이해할 때까지 다른 모든 것을 제거하고 해당 함수를 단순화하십시오. – Mat

+0

충돌이 발생한 곳을 가리키고 오류 메시지가 표시됩니다. – Eric

+0

이 줄은 문제가됩니다. 'while ((i <= 20) && (bool == 1))'이라고합니다. '20'항목을 포함하는 배열의 경우 가장 유효한 유효 색인은 '20'이 아니라 '19'입니다. –

답변

1

처음에는 readString을 호출하면 프로그램을 중단시킬 수 있습니다.

wordmystery 배열, 그래서 &wordchar ** 아닌 char *입니다. 당신은 사용해야합니다

readString(word, mystery); 

그러나 컴파일러는 경고를 발행해야합니다. 초보자가 주의력을 이해하지 못하는 경우에 발생할 수있는 실수를 나타 내기 위해주의를 분산시키는 경고는 없습니다.

나중에 다른 문제가 발생할 수 있습니다 ...

+0

경고와 프로그램이 더 이상 충돌하지 않도록 수정했습니다. 왼쪽 문제는 지금 기능하고 있습니다. – Lakouz

0

readString() 함수를 사용하는 경우 대신 NULL 대신 '\ 0'을 사용해야합니다. C 문자열은이 문자로 끝납니다.

+0

고맙습니다. 나는 그것이 단지 0 또는 NULL 또는 다른 무엇인가라면 지금하지 않았다 :) – Lakouz

+0

다행이다. 나는 도움이되었다. 그리고 유용한 답변을 찾을 때마다 upvote를하십시오. –

+0

제가 시도한 바에는, 그렇게하기에는 충분한 평판이 없다고 말합니다.>< – Lakouz

0

bool 변수를 유형으로 선언 할 수 없습니다. C에서는 bool이 표준의 일부가 아니기 때문에 실제로 모든 컴파일러에 정의되어 있지 않지만 일부 컴파일러와 일부 플랫폼에서는이를 정의 할 것입니다.

+1

'stdbool을 포함하는 경우에만. h '이고, 이는 하드 컴파일 오류입니다. – Mat

+0

이것이 실제 C가 아니지만 C++ – Eric

+0

으로 컴파일 될 가능성이 있습니다. 코드가 C++로 컴파일되지 않습니다. OP는 그것을 컴파일 말한다. – Mat

관련 문제