Если ввести фразу короче девяти символов после вывода результата выскакивает ошибка - 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
и символ, который следует после нее.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д