c - 数组声明的问题

标签 c declaration strlen

我的代码有点问题。 我正在编写一个 C 项目,我需要声明一个与另一个完全相同大小的字符字段,问题是任何时候我的初始字符串( secret )长于 7 个字符,它声明为 14 个字符。 这是一行:

char guessedWord[strlen(secret)];

更新,即使我将其声明为:

char guessedWord[10];

而且 secret 比 7 长,它声明为 14,WTF?我认为这应该是不可能的......(使用 strlen 来获得长度)

函数是这样的:

    void hangman(const char secret[]) //Samotna hra
{
    int guesses=8; //zostavajuce pokusy
    int iteration=0; //iteracia
    char *lettersLeft="abcdefghijklmnopqrstuvwxyz"; //zostavajuce pismena
    char letters_guessed[ALPHABET_LENGHT]; //uz hadane pismena
    char input[100]; //vstupny znak
    char guessedWord[8]; //Zobrazene slovo

    for (int i=0; i < strlen(secret); i++) //inicializacia hadaneho slova
    {
        guessedWord[i]='_';
    }
    for (int i=0; i < ALPHABET_LENGHT; i++) //inicializacia zoznamu hadanych pismen
    {
        letters_guessed[i]='_';
    }

    printf("Guessed word init %s strlen of secret is %ld, secret is %s and strlen of guessedWord is %ld\n", guessedWord, strlen(secret), secret, strlen(guessedWord));

最佳答案

char guessedWord[8]; //Zobrazene slovo

for (int i=0; i < strlen(secret); i++) //inicializacia hadaneho slova
{
    guessedWord[i]='_';
}

strlen 不会询问编译器以了解文字/数组的大小(就像您在某些情况下可以使用 sizeof 那样,但它有其局限性)。它只是寻找终止零,因此它可以用于任何字符串(字符上的指针)。

因此,不以 nul 结尾的字符串会使 strlenguessedWord 的边界之外寻找零(未定义的行为)

您需要分配适当数量的字符和空终止符:

int len = strlen(secret)
char guessedWord[len+1]; //Zobrazene slovo
int i;
for (i=0; i < len; i++) //inicializacia hadaneho slova
{
    guessedWord[i]='_';
}
guessedWord[i] = '\0'; // i == len here

关于c - 数组声明的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47495933/

相关文章:

从 setuid root C 程序调用脚本 - 脚本不以 root 身份运行

此处不允许 java.util.Scanner 对象声明

c - static size_t strnlen(const char *s, size_t max) -- 为什么是静态返回值?

c - 对二维数组进行别名时 strlen 的意外优化

检查特定 gcc 编译器的 glibc 版本

c - 两个C程序相互交互并玩猜谜游戏

c - 从 C 中的结构开始

c++ - 模板类的模板友元函数

c - 警告 : implicit declaration of function - order of includes matter?

C++:在 uchar/guchar 中获取数据的事实大小?