所以我做了一个' 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²#*" */
答案 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';
使用指针可以更简洁地表达上述内容,但这可能会被认为更高级,因此将其编入索引。