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