在函数内更新字符串数组

updating string array inside a function

我正在尝试将一个带有新字符串的字符串数组传递给一个函数,在这个函数中我想将这个字符串添加到数组中并重置该字符串。我似乎无法让它在函数内部工作,但没有它就可以工作

int main(void)
{
    const char* text = "hello world";
    int text_length = strlen(text);

    char* words[text_length];
    char word[text_length];

    int length = 0;
    int k = 0;

    for (int i = 0; i < text_length; ++i) {
        if (isspace(text[i])) {
            words[length] = malloc(strlen(word) + 1);
            strcpy(words[length++], word);
            memset(word, 0, sizeof(word));
            k = 0;
        }

        //...
        //... adding chars to the word
        word[k++]= text[i];
    }
}

这个很好用,这个不行:

void add_word(char* words[], char* word, int* words_length, int* word_cursor)
{
    words[*words_length] = malloc(strlen(word) + 1);
    strcpy(words[*words_length++], word);
    memset(word, 0, sizeof(word));
    *word_cursor = 0;
}

int main(void)
{
    const char* text = "hello world";
    int text_length = strlen(text);

    char* words[text_length];
    char word[text_length];

    int length = 0;
    int k = 0;

    for (int i = 0; i < text_length; ++i) {
        if (isspace(text[i])) {
            add_word(words, word, &length, &k);
        }
        //...
        //... adding chars to the word
        word[k++]= text[i];
    }
}

我错过了什么?

你有未定义的行为

void add_word(char* words[], char* word, int* words_length, int* word_cursor) {
   strcpy(words[*words_length++], word);

因为,word 不包含 space 来保存 null 个字符。

const char* text = "hello world";
int text_length = strlen(text);
char word[text_length];

应该是

char word[text_length+1];

  …
    if (isspace(text[i])) {
        word[k]= '[=13=]';   //Null terminate the string
        add_word(words, word, &length, &k);
    }

我的猜测是它不起作用,因为你没有在[=12中正确添加空终止符=]数组。

在第二个示例中,您只是复制粘贴了第一个工作代码中的代码,而忘记更改一个关键位:

memset(word, 0, sizeof(word));

在函数add_word中变量word是一个指针sizeof(word)returns指针的大小本身而不是它指向的东西。

确保 word 中的字符串始终以 null 结尾的最佳解决方案是,当您想将其视为字符串时,在需要的地方实际明确地添加终止符:

if (isspace(text[i])) {
    word[k] = '[=11=]';  // Add null-terminator
    add_word(words, word, &length, &k);
}