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

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

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

Код ниже разбирает строку с помощью разделителя и выводит результат в виде отдельных подстрок. Если 51 строка представлена в виде:
 char str[] = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,";
то всё работает отлично! Если эту же строку представить в таком виде:
 char *str = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,";
то получаю Segmentation fault при назначении нуля на строке 19. Смотрю отладчик. *str в обеих случаях указывает куда нужно. *p в обеих случаях идентичен! Подскажите, пожалуйста, ЧЯДНТ? Заранее благодарю!
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
 
size_t split(
    char * str,
    const char delim,
    char ***array
)
{
    char *p = NULL;
    char **res = NULL;
    size_t count = 0;
 
    p = str;
    // Count occurance of delim in string
    while((p=strchr(p,delim)) != NULL) {
        *p = 0; // Null terminate the deliminator.
        p++; // Skip past our new null
        count++;
    }
 
    // allocate dynamic array
    if(count > 0){
        res = (char**)calloc(count,sizeof(char*));
        if(!res){
            printf("Error: can't allocate memory!");
            exit(EXIT_FAILURE);
        }
    }else{
        return(count);
    }
 
    p = str;
    for(size_t i=0; i<count; i++) {
        if(*p)res[i] = p;  // Copy start of string
        p = strchr(p,0);  // Look for next null
        p++; // Start of next string
    }
 
    *array = res;
 
    return(count);
}
 
int main(void)
{
    char **tokens = NULL;
 
    char str[] = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,";
    //char *str = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,";
 
    size_t count = split(str,',',&tokens);
    if(count == 0) {
        printf("Error: %s errno: %d \n", strerror(errno), errno);
    }
 
    printf("count: %zu\n", count );
    for(size_t i=0; i < count; i++) {
        printf("str: %s\n", tokens[i]);
    }
 
    /* freeing tokens */
    free (tokens);
 
    return(0);
}

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

textual
Листинг программы
    char *st="JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,";
    char *str =(char*)malloc(strlen(st)*sizeof(char)+1);
    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