Значение массива отсутствует после цикла for C

#c

#c

Вопрос:

Я новичок в C, и у меня проблема с этим созданным мной кодом, который должен принимать строку и разделитель, разделять строку и помещать их в список. Я пытался печатать символы один за другим, и это работает (показывает HelloWorld), но по какой-то причине оно не сохраняется после завершения цикла. Кто-нибудь может помочь?

Вот код.

 #include <stdio.h>
#include <string.h>

int main()
{
    char *string = "Hello World";
    char delimiter = ' ';
    char **strings_list = malloc(sizeof(string)   1);
    int word = 0;

    for (int i = 0; i <= strlen(string); i  )
    {
        if (string[i] == delimiter)
        {
            word  ;
        }
        else
        {
            strings_list[word][i] = string[i];
        }
    }

    printf("%s", strings_list[0]);
    free(strings_list);

    return 0;
}
 

Комментарии:

1. Поскольку string это указатель, его размер будет размером самого указателя , а не того, на что он может указывать. Используется strlen для получения длины строки с нулевым завершением.

2. У вас также есть другие проблемы, например, использование неинициализированных указателей в strings_list[word] . Возможно, вам придется потратить больше времени на учебники и прочитать больше о строках и указателях.

3. <= должно быть <

4. Вы никогда не добавляете нулевые терминаторы к строкам.

5. Но если strings_list нужно удерживать N символов *, вам нужно malloc(N * sizeof *strings_list) .

Ответ №1:

Проблемы, обнаруженные в вашем коде

  1. Используется strlen для получения длины строки с нулевым завершением
  2. Вместо i <= strlen(string) использования i < strlen(string)
  3. Выделите память для каждого элемента в строке
  4. Освободите всю память.

Ниже приведен обновленный код

 #include <stdio.h>
#include <string.h>
#include <stdlib.h> /* for malloc amp; free*/

int main()
{
    char *string = "Hello World";
    char delimiter = ' ';
    char **strings_list;
    int word = 0;
    int maxelementsinword = 6; /* Max size of a word - here its 5   1 Null char */
    int maxitemsinlist = 2;  /* Num of items in list - here its 2 */
    int j = 0;

    strings_list = malloc(maxitemsinlist * sizeof(char*));
    for (int i = 0; i < maxitemsinlist; i  )
        strings_list[i] = malloc((maxelementsinword 1) * sizeof(char)); /* sizeof(char) is 1, but to make it clear */
        
    for (int i = 0; i < strlen(string); i  )
    {
        if (string[i] == delimiter)
        {
            strings_list[word][j] = ''; /* Null terminate the string */
            word  ;
            j = 0;
        }
        else
        {
            strings_list[word][j] = string[i];
            j  ;
        }
    }

    for (int i = 0; i < maxitemsinlist; i  )
    {
        printf("n %s", strings_list[i]);
        free(strings_list[i]); /* Free the items in list*/
    }

    free(strings_list); /* free list*/
    
    return 0;
}
 

Комментарии:

1. Завершаете ли вы строки нулевым значением?