为什么C会在我的char数组中添加奇怪的字符?

时间:2017-04-25 21:22:32

标签: c character

我正在处理一个刽子手项目,正如你在我的代码中看到的那样,它在某些情况下会为我的字符串添加一些奇怪的字符。并非总是,但大部分时间。 (例如:MOUSE => MOUSE @ 由于我不能进行字符串比较,而且它也很难看。任何解决方案?

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

char animals [8][20] = {"LION" ,"GIRAFFE","OCTOPUS", "RHINOCEROS","CENTIPEDE",  "ELEPHANT", "MOUSE", "DOG"};
int i ;

int main() {
    srand(time(0));
    int choose;
    choose = rand()% 7;
    int length;
    printf("%s", animals[choose]);
    length = strlen(animals[choose]);
    char result[length];

    for(i=0; i< length;i++) {
        result[i] = '_' ;
    }

  printf("%s", result);

  while(1) {
    printf("\nEnter guess char!:  ") ;
    char guess ;
    scanf(" %c", &guess) ;
    guess = toupper(guess) ;
    hangman(guess, result, animals[choose], length ) ;
  }

  return 0;
}

void hangman (char guess, char result[], char word[], int length ){
    for(i=0; i< length; i++) {
        if(guess == word[i]) {
            result[i] = guess ;
    }
  }

  printf("%s", result) ;

  if(strcmp(result, word)== 0 ){
    printf("gratulation!") ;
  }
}

2 个答案:

答案 0 :(得分:0)

strlen(animals [choose])在字符串中不包含'\ 0'NUL终止字符,因此在创建结果时需要添加一个到长度。你还需要null结束这样的结果;

char result[length+1];
result[length] = '\0';

答案 1 :(得分:0)

对于初学者,我认为你的意思是

choose = rand() % 8;
                 ^^^

因为数组动物被声明为

char animals [8][20] = /*...*/;
             ^^^

此调用中使用的格式说明符"%s"

printf("%s", result) ;

旨在输出终止为零的字符串。但是,字符数组result不包含字符串。

你可以写

char result[length + 1] ;
for(i=0; i < length;i++) {
result[i] = '_' ;
}
result[i] = '\0';