Если ввести фразу короче девяти символов после вывода результата выскакивает ошибка - 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));

Объяснение кода листинга программы

В данном коде выполняется следующая последовательность действий:

  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 и символ, который следует после нее.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5
Похожие ответы