【问题标题】:updating string array inside a function更新函数内的字符串数组
【发布时间】:2019-10-01 07:42:13
【问题描述】:

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

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];
    }
}

我错过了什么?

【问题讨论】:

  • 请尝试创建一个minimal reproducible example 向我们展示,其中包括所有变量定义及其初始化方式。一个完美的例子是我们可以复制粘贴它并复制您的确切问题(并且不会出现任何不相关的错误)。
  • 顺便说一句,在add_word 函数中sizeof(word) 不会工作(至少不是你想要的工作方式)。
  • 抱歉,我已经用所有缺失的数据更新了我的示例。
  • 函数add_word中,word是指针,不是数组,所以sizeof(word)只是指针的大小,而不是数组的长度。

标签: c arrays string malloc c99


【解决方案1】:

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

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

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

在函数add_word 中,变量word 是一个指针sizeof(word) 返回指针本身的大小,而不是它所指向的大小。

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

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

【讨论】:

  • 谢谢,它有效。我删除了函数内部的 memset 并在字符串中添加了一个空终止符。现在效果很好。谢谢
【解决方案2】:

您对

有未定义的行为
void add_word(char* words[], char* word, int* words_length, int* word_cursor) {
   strcpy(words[*words_length++], word);

因为,word 不包含容纳 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]= '\0';   //Null terminate the string
        add_word(words, word, &length, &k);
    }

【讨论】:

  • 我确实需要用 '\0' 以空值结尾我的字符串,但我的add_words 中也有一个 memset 问题,所以我会将一些程序员老兄的答案标记为正确答案,但谢谢无论如何。
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2020-01-23
相关资源
最近更新 更多