обновление массива строк внутри функции - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь передать массив строк с новой строкой в ​​функцию, и внутри этой функции я хочу добавить эту строку в массив и сбросить строку. Кажется, я не могу заставить ее работать внутри функции, но без нее она работает

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

Чего мне не хватает

Ответы [ 2 ]

1 голос
/ 01 октября 2019

My предположим, , что это не работает, потому что вы не добавили нулевой терминатор должным образом в массив 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);
}
1 голос
/ 01 октября 2019

У вас неопределенное поведение с

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

As, word не содержит места для хранения null char.

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);
    }
...