Если ввести фразу короче девяти символов после вывода результата выскакивает ошибка - C (СИ)
Формулировка задачи:
Доброго времени суток.
Пытаюсь написать код, который разбивает фразы на отдельные слова с помощью динамической памяти, вроде работает, но очень странно, на пример если ввести фразу короче девяти символов после вывода результата выскакивает ошибка, а если ввести одно только слово короче девяти символов, то выводит его и надпись "<null>". Подскажите где напортачил, а то голову уже себе сломал.
int main(){
char text[80],c;
char *separate, **index;
int i,size=0;
printf("Vvedite text:\n");
gets(text);
for(i=0;i<80;i++){
c=text[i];
if(c==' ' || c=='\n')
size++;
}
i=0;
index=(char**)malloc(sizeof(char*)*(size));
separate=strtok(text, " ");
index[i]=(char*)malloc(sizeof(char*)*(strlen(separate)+1)) ;
strcpy(index[i],separate);
while((separate=strtok(NULL, " ")) != NULL){
i++;
index[i]=(char*)malloc(sizeof(char*)*(strlen(separate)+1)) ;
strcpy(index[i],separate);
}
for(i=0;i<size;i++)
printf("%s\n",index[i]);
system("pause");
return 0;
}Решение задачи: «Если ввести фразу короче девяти символов после вывода результата выскакивает ошибка»
textual
Листинг программы
index[i]=(char*)malloc(sizeof(char*)*(strlen(separate)+1));
Объяснение кода листинга программы
В данном коде выполняется следующая последовательность действий:
index[i]=(char*)malloc(sizeof(char*)*(strlen(separate)+1);- выделяется память под массив указателей на символы. В данном случае, мы выделяем память подstrlen(separate)+1указателей на символы. Здесьseparate- это строка, которая была введена пользователем. Пояснение:index[i]- это переменная, которая будет хранить массив указателей на символы.(char*)malloc(sizeof(char*)*(strlen(separate)+1);- выделение памяти под массив указателей на символы. Здесьsizeof(char*)возвращает размер указателя на символ, а*(strlen(separate)+1)- это количество памяти, которое мы хотим выделить. Пояснение:sizeof(char*)возвращает размер указателя на символ, который обычно равен 4 или 8 байтам в 32-битных и 64-битных системах соответственно.strlen(separate)- это функция, которая возвращает длину строкиseparate. То есть, количество символов в этой строке.*(strlen(separate)+1)- это выражение, которое преобразуется в количество памяти, которое мы хотим выделить. То есть, мы хотим выделить память подstrlen(separate)+1указателей на символы. Пояснение:- В C, каждый символ в строке хранится в отдельном указателе на символ.
- Таким образом, чтобы хранить строку из
nсимволов, нам нужно выделить память подn+1указателей на символы (для самой строки и для символа, который следует после строки). - Поэтому, мы выделяем память под
strlen(separate)+1указателей на символы, чтобы хранить строкуseparateи символ, который следует после нее.