Использование 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д