#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:
Проблемы, обнаруженные в вашем коде
- Используется
strlen
для получения длины строки с нулевым завершением - Вместо
i <= strlen(string)
использованияi < strlen(string)
- Выделите память для каждого элемента в строке
- Освободите всю память.
Ниже приведен обновленный код
#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. Завершаете ли вы строки нулевым значением?