Использование 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