2014-01-25 4 views
0

그래서 PHP의 explode 함수와 동일한 기능을하는 C 함수를 찾고 있습니다. 익숙하지 않은 사용자 : Explode는 문자열을 잡고 주어진 char/escape 시퀀스로 구분 된 각 항목을 구문 분석합니다. 이 함수의 가장 중요한 부분은 모든 항목이있는 이미 위조 된 배열 인 반환 값입니다. 문제는 이것이 C에서 존재하지 않는 것 같습니다. 가장 가까운 함수는 strchr이지만 split의 첫 번째 발생에 대한 포인터 만 반환합니다.PHP의 explode 함수 대신 C

편집 : 여기에 함수가 있는데, 다른 동작 (반환 값이 다름)이 있기는하지만 그것이 내가 원하는 것입니다.

char str[] = "test1|test2|test3"; 
char** res; 
int count = explode(str, "|", &res); 
int i; 
for (i = 0; i < count; ++i) { 
    printf("%s\n", res[i]); 
    free(res[i]); 
} 
free(res); 
+0

이것에 대해 조사해 보셨습니까? – asprin

답변

1

사용 strtok() :

int explode(char* str, char* delim, char ***r) { 
    char **res = (char**) malloc(sizeof(char*) * strlen(str)); 
    char *p; 
    int i = 0; 
    while (p = strtok(str, delim)) { 
     res[i] = malloc(strlen(p) + 1); 
     strcpy(res[i], p); 
     ++i; 
     str = NULL; 
    } 
    res = realloc(res, sizeof(char*) * i); 
    *r = res; 
    return i; 
} 

는이 방법을 호출 할 수 있습니다. 그 맨 페이지에서 :

strtok() 함수는 문자열을 일련의 토큰으로 구문 분석합니다. strtok()에 대한 첫 번째 호출에서 구문 분석 할 문자열은 str에 으로 지정해야합니다. 이후의 각 호출에서 동일한 문자열을 구문 분석해야 할 경우 str 은 NULL이어야합니다.

strtok()을 호출 할 때마다 NULL 종료 문자열 에 다음 포인터가 포함 된 포인터가 반환됩니다. 이 문자열에는 한정 숫자 인 바이트가 포함되지 않습니다. 토큰이 더 이상 발견되지 않으면 strtok()은 NULL을 반환합니다. 즉

, 루프 당신의 문자열을 통해하고 (즉,이 strtok()의 첫 번째 호출에 지정된 구분 기호에 분할 것)이 char*로 반환 된 모든 단어를 얻기 위해 NULL 반환 될 때까지 strtok()를 계속 전화.

+1

덕분에, 나는 기능을 설정하는 데 다소 어려움을 겪었지만 내 친구는 그것을 해결했다 :) 나는 OP에 해결책을 올릴 것이다. – zecoxao