2013-10-15 4 views
0

J'ai essayé de créer une fonction qui divise une chaîne et renvoie un pointeur vers le premier élément du tableau. Il compile sans erreur mais quand je cours le programme il se bloque. Voici mon code. Toute aide sur la façon de résoudre ce problème. Merci.c tableau de pointeurs

#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

Il n'y a aucun moyen de compiler sans avertissement. Vous devez activer les avertissements de compilation. – user694733

+0

Et vous devriez éviter d'appeler 'strlen()' à plusieurs reprises. Comme 'str' ne change pas sa longueur, il vaudrait mieux le déterminer une fois et utiliser cette valeur. Cela fait gagner du temps. – glglgl

Répondre

1

En plus de la réponse de Acme que vous pouvez pas modifier un string literal:

On dirait que votre boucle à travers str, augmentant i jusqu'à i < strlen(str), cependant, au-dessous que vous allez str+i+j. Qu'est-ce qui se passe quand j est comme 10 et vous êtes à la fin de str? Vous finissez probablement par sortir de la mémoire pour str ce qui entraîne une erreur de segmentation.

Je recommande de regarder à travers string.h que vous incluez déjà. Il y a des fonctions pour le faire d'une manière beaucoup plus sûre.

1

Ce

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

est un pointeur vers la chaîne littérale "This is a house isisis is" - le modifier va planter le programme.

Utilisez ceci:

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

également votre fonction split a une boucle infinie.

+0

"en le modifiant, il va planter le programme" ~ il ne doit pas nécessairement planter, mais il est en lecture seule et en essayant de le modifier donne UB, ouais. – LihO