Использование strchr(). Segmentation fault. Что я делаю не так? - C (СИ)

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

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

Код ниже разбирает строку с помощью разделителя и выводит результат в виде отдельных подстрок. Если 51 строка представлена в виде:
Листинг программы
  1. char str[] = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,";
то всё работает отлично! Если эту же строку представить в таком виде:
Листинг программы
  1. char *str = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,";
то получаю Segmentation fault при назначении нуля на строке 19. Смотрю отладчик. *str в обеих случаях указывает куда нужно. *p в обеих случаях идентичен! Подскажите, пожалуйста, ЧЯДНТ? Заранее благодарю!
Листинг программы
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <errno.h>
  5. size_t split(
  6. char * str,
  7. const char delim,
  8. char ***array
  9. )
  10. {
  11. char *p = NULL;
  12. char **res = NULL;
  13. size_t count = 0;
  14. p = str;
  15. // Count occurance of delim in string
  16. while((p=strchr(p,delim)) != NULL) {
  17. *p = 0; // Null terminate the deliminator.
  18. p++; // Skip past our new null
  19. count++;
  20. }
  21. // allocate dynamic array
  22. if(count > 0){
  23. res = (char**)calloc(count,sizeof(char*));
  24. if(!res){
  25. printf("Error: can't allocate memory!");
  26. exit(EXIT_FAILURE);
  27. }
  28. }else{
  29. return(count);
  30. }
  31. p = str;
  32. for(size_t i=0; i<count; i++) {
  33. if(*p)res[i] = p; // Copy start of string
  34. p = strchr(p,0); // Look for next null
  35. p++; // Start of next string
  36. }
  37. *array = res;
  38. return(count);
  39. }
  40. int main(void)
  41. {
  42. char **tokens = NULL;
  43. char str[] = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,";
  44. //char *str = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,";
  45. size_t count = split(str,',',&tokens);
  46. if(count == 0) {
  47. printf("Error: %s errno: %d \n", strerror(errno), errno);
  48. }
  49. printf("count: %zu\n", count );
  50. for(size_t i=0; i < count; i++) {
  51. printf("str: %s\n", tokens[i]);
  52. }
  53. /* freeing tokens */
  54. free (tokens);
  55. return(0);
  56. }

Решение задачи: «Использование strchr(). Segmentation fault. Что я делаю не так?»

textual
Листинг программы
  1.     char *st="JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,";
  2.     char *str =(char*)malloc(strlen(st)*sizeof(char)+1);
  3.     strcpy(str, st);

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

  1. Объявляется строка JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC, и присваивается переменной st типа char*
  2. Выделяется память под строку с помощью malloc, размер которой равен strlen(st) + 1 байт (для нулевого символа)
  3. С помощью функции strcpy, содержимое строки st копируется в выделенную память str

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


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

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

12   голосов , оценка 3.75 из 5

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

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

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