2013-10-15 4 views
0

Я пытался создать функцию, которая разбивает строку и возвращает указатель на первый элемент массива. Он компилируется без ошибок, но когда я запускаю программу, она сработает. Вот мой код. Любая помощь в том, как это исправить. Благодарю.c массив указателей

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

#define split_count(a) a 

int count(char *str, char *sub) { 
    int sublen = strlen(sub); 
    int templen = 0; 
    int count = 0; 

    if (sublen > strlen(str)) 
     return 0; 

    int i, j; 
    for (i = 0; i < strlen(str); i++) { 
     if (*(str + i) == *sub) { 
      templen = 1; 
      for (j = 1; j < sublen; j++) { 
       if (*(str + i + j) == *(sub + j)) { 
        templen += 1; 
       } 
      } 

      if (templen == sublen) { 
       count += 1; 
      } 

      templen = 0; 
     } 
    } 

    return count; 
} 

char * split(char *str, char *sep, int maxsplit) { 
    if (!count(str, sep)) 
     return NULL; 

    char *arr[split_count(count(str, sep)) + 1]; 

    int i, j; 
    int templen = 0; 

    int stop = 0; 

    int counter = 0; 

    for (i = 0; i < strlen(str); i++) { 
     if (*(str + i) == *sep) { 
      templen = 1; 

      for (j = 1; j < strlen(sep); j++) { 
       if (*(str + i + j) == *(sep + j)) { 
        templen += 1; 
       } 

       if (templen == strlen(sep)) { 
        arr[counter] = (char*)malloc(sizeof(char) * strlen(str)); 

        strcpy(arr[counter], ""); 

        int k; 
        for (k = stop; k < i; k++) { 
         *(arr[counter] + strlen(arr[counter])) = *(str + k); 
         *(arr[counter] + strlen(arr[counter])) = '\0'; 
        } 

        stop = i + strlen(sep); 

        counter++; 
       } 
      } 
     } 
    } 

    return arr[0]; 
} 

int main() { 
    char *before = "This is a house isisis is"; 

    printf("%s\n", split(before, "is", 1)); 

    return 0; 
} 
+0

Невозможно скомпилировать его без предупреждений. Вы должны включить предупреждения компиляции. – user694733

+0

И вам не следует многократно называть 'strlen()'. Поскольку 'str' не изменяет свою длину, было бы лучше определить его один раз и использовать это значение. Это экономит время. – glglgl

ответ

1

В дополнение к ответу Acme, что вы можете не изменить string literal:

Похоже, ваш цикл через str, увеличивая i до i < strlen(str), однако, ниже, что вы идете в str+i+j. Что происходит, когда j равно 10, и вы находитесь в самом конце str? Скорее всего, вы выходите за пределы памяти для str, что приводит к ошибке сегментации.

Рекомендую посмотреть string.h, который вы уже включили. Есть функции для этого гораздо безопаснее.

1

Этот

char *before = "This is a house isisis is"; 

является указателем на строку буквального "This is a house isisis is" - изменение это приведет к краху программы.

Используйте это:

char before[50] = "This is a house isisis is"; 

Кроме того, ваша функция разделения имеет бесконечный цикл.

+0

«изменение его приведет к сбою программы» ~ он не обязательно должен аварийно завершаться, но он находится в постоянной памяти и пытается изменить его, дает UB, да. – LihO

Смежные вопросы