Если ввести фразу короче девяти символов после вывода результата выскакивает ошибка - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Пытаюсь написать код, который разбивает фразы на отдельные слова с помощью динамической памяти, вроде работает, но очень странно, на пример если ввести фразу короче девяти символов после вывода результата выскакивает ошибка, а если ввести одно только слово короче девяти символов, то выводит его и надпись "<null>". Подскажите где напортачил, а то голову уже себе сломал.
Листинг программы
  1. int main(){
  2. char text[80],c;
  3. char *separate, **index;
  4. int i,size=0;
  5. printf("Vvedite text:\n");
  6. gets(text);
  7. for(i=0;i<80;i++){
  8. c=text[i];
  9. if(c==' ' || c=='\n')
  10. size++;
  11. }
  12. i=0;
  13. index=(char**)malloc(sizeof(char*)*(size));
  14. separate=strtok(text, " ");
  15. index[i]=(char*)malloc(sizeof(char*)*(strlen(separate)+1)) ;
  16. strcpy(index[i],separate);
  17. while((separate=strtok(NULL, " ")) != NULL){
  18. i++;
  19. index[i]=(char*)malloc(sizeof(char*)*(strlen(separate)+1)) ;
  20. strcpy(index[i],separate);
  21. }
  22. for(i=0;i<size;i++)
  23. printf("%s\n",index[i]);
  24. system("pause");
  25. return 0;
  26. }

Решение задачи: «Если ввести фразу короче девяти символов после вывода результата выскакивает ошибка»

textual
Листинг программы
  1. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы