Использование strchr(). Segmentation fault. Что я делаю не так? - C (СИ)
Формулировка задачи:
Код ниже разбирает строку с помощью разделителя и выводит результат в виде отдельных подстрок.
Если 51 строка представлена в виде:
то всё работает отлично!
Если эту же строку представить в таком виде:
то получаю Segmentation fault при назначении нуля на строке 19.
Смотрю отладчик. *str в обеих случаях указывает куда нужно. *p в обеих случаях идентичен!
Подскажите, пожалуйста, ЧЯДНТ? Заранее благодарю!
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,";
#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);
Объяснение кода листинга программы
- Объявляется строка
JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,
и присваивается переменной st типа char* - Выделяется память под строку с помощью malloc, размер которой равен strlen(st) + 1 байт (для нулевого символа)
- С помощью функции strcpy, содержимое строки st копируется в выделенную память str
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д