char字符串在c中未正确打印

时间:2014-05-19 11:04:04

标签: c

所以我做了一个' guess_the_word' c中的游戏,其中包含一个带有“' - '和' '无论什么时候你找到一个正确的角色,这个角色都可以替代' - '或者' '。但是,似乎这个秘密词没有正确印刷。虽然它第一次似乎工作。当我用一个连续2个相同字符的单词时出现这个问题,然后对于我使用的每个单词。

  int sel_size, i;
  char select_word[] = "football"; /* the word we are searching*/
  sel_size = strlen(select_word);
  char secret_word[sel_size];

  for (i = 0; i < sel_size; i += 2)
  {
    secret_word[i] = '_';
  }

  for (i = 1; i < sel_size; i += 2)
  {
    secret_word[i] = '-';
  }

  printf("player 2 the secret word is now %s\n", secret_word);/* it should print "_-_-_-_-" but it prints somthing like this"_-_-_-_-0²#*" */

1 个答案:

答案 0 :(得分:1)

C中的字符串是字符'\0'的字符数组终止。你永远不会对secret_word执行此操作,因此打印它将调用未定义的行为。

您需要允许数组大小的终结符:

const size_t sel_size = strlen(select_word);
char secret_word[sel_size + 1]; /* Add 1 to fit the terminator. */

然后在初始化字符后,终止字符串:

secret_word[sel_size] = '\0';

此外,通过 2 递增i的业务也是错误的,这将耗尽数组太快并导致在您走出数组之外的未定义行为。不要那样做。只是做:

memset(secret_word, '_', sel_size);
secret_word[sel_size] = '\0';

UPDATE :啊,你想要用破折号分隔的下划线。然后你需要:

char secret_word[2 * sel_size];

for(size_t i = 0; i < sel_size; ++i)
{
  secret_word[2 * i] = '_';
  secret_word[2 * i + 1] = '-';
}
secret_word[2 * sel_size - 1] = '\0';

使用指针可以更简洁地表达上述内容,但这可能会被认为更高级,因此将其编入索引。