2014-12-15 2 views
-1

이 문제는 나를 좌절시킵니다. 나는 전에 그것을 풀어 봤지만 정확히 어떻게 더 이상 기억할 수없고 그것이 몇 번이고 올랐다!C에서 문자열 배열로 문자열 분할

과일 목록과 같이 쉼표로 구분 된 문자열이 표시됩니다. 문자열을 쉼표로 문자열 배열로 분할하려고합니다. 분할 왜곡이 계속 발생하는 이유를 알 수 없습니다. 내가 사용 된 문자열이 읽기 전용 액세스 할 수있는 일정한 것을

char** split(char *); 
int count_words(char *); 

int main(int argc, char **argv) { 

    char *my_list = "Apple, banana, cherry, dragonfruit, elderberry"; 
    char **split_list = split(my_list); 

    /*int i = 0; 
    while(split_list[i] != NULL) { 
    printf("%s\n", split_list[i]); 
    i++; 
    }*/ 

    return 0; 
} 

char** split(char *str) { 
    int num_words = count_words(str); 
    char **my_words = malloc((num_words + 1) * sizeof(char*)); 

    const char delim[2] = ","; 
    char *token; 
    token = strtok(str, delim); 

    for(int i = 0; i < num_words; i++) { 
    my_words[i] = malloc(sizeof(char) * strlen(token)); 
    strcpy(my_words[i], token); 

    token = strtok(NULL, delim); 
    } 

    my_words[i] = NULL; 

    return my_words; 
} 

int count_words(char *str) { 
    int cnt = 0; 
    while(*str != '\0') { 
    if(*str == ',') cnt++; 
    str++; 
    } 

    return ++cnt; 
} 
+0

당신은 너무 늦게부터'token' 한 단어를 복사하기 시작 아닌가요? 첫 번째 쉼표 뒤에 *를 가리 킵니다. – usr2564301

+0

my_words [i] = NULL; -이 모든 컴파일합니까? 그렇다면이 시점에서 i의 가치는 무엇입니까? – Silvester

+0

또한,'strtok()'은 주어진 문자열에 쓰고 문자열 상수를 전달합니다. –

답변

2

세상에, 나는 거대한 brainfart했다 ...

대답은 간단하다 : 여기에 내 코드입니다. 다음과 같은 문자열 선언 : char *myStr = "Hello World"은 읽기 전용입니다! 당신은 그것에 쓸 수 없습니다.

솔루션 코드 :

char** split(char *); 
int count_words(char *); 

int main(int argc, char **argv) { 

    const char *string = "Apple, banana, cherry, dragonfruit, elderberry"; 
char *my_list = malloc(1 + strlen(string)); //random number 
strcpy(my_list, string); 
char **split_list = split(my_list); 

int i = 0; 
while(split_list[i] != NULL) { 
    printf("%s\n", split_list[i]); 
    free(split_list[i]); 
    i++; 
} 
free(split_list); 
free(my_list); 

return 0; 
} 

char** split(char *str) { 
int num_words = count_words(str); 
char **my_words = malloc((1 + num_words) * sizeof(char*)); 
const char delim[2] = ","; 
char *token; 
token = strtok(str, delim); 

int i = 0; 
while(token != NULL) { 
    my_words[i] = malloc(sizeof(char) * (1 + strlen(token))); 
    strcpy(my_words[i], token); 

    token = strtok(NULL, delim); 
    i++; 
} 
my_words[i] = NULL; 

return my_words; 
} 

int count_words(char *str) { 
int cnt = 0; 

while(*str != '\0') 
{ 
    if(*str == ',') 
     cnt++; 
    str++; 
} 

return ++cnt; 
} 
+0

모든 malloc 호출에 메모리 누수가 있습니다. 널 종료 바이트를위한 공간을'my_words [i] = malloc (sizeof (char) * strlen (토큰));'에 할당하지 마십시오. 그리고 문자열의 초기 복사본이 최선의 방법은 아닙니다. 그러나 당신의 답변은 여전히 ​​정확합니다. –

+0

네, 아마이 질문을 너무 일찍 올렸을 것입니다. 방금 할 수 있음을 깨달았습니다. char my_list [] = "Apple, Banana ... etc"; – Grandclosing