2014-10-14 3 views
0

문자열 (사용자가 런타임에 입력)을 단어 (공백으로 구분)로 분할하려고하고 각 단어를 다른 슬롯에 넣으려고합니다. 정렬. 예를 들어, 문자열 "hello world"을 가져온 경우 array[0]"hello"이고 array[1]"world"을 포함합니다. 마지막 슬롯 (이 경우 array[2])에는 NULL이 포함됩니다. 여기 내가 지금까지 가지고있는 것이지, 제대로 작동하지 않는 것 같습니다. 어떤 도움을 주시면 감사하겠습니다. 각 변수는 argv [i]를위한 메모리를 할당하고 argv를 현재의 토큰을 복사 할 필요문자열의 각 단어를 C로 배열에 넣으십시오

char input[100]; 
char* argv[20]; 
char* token; 
scanf("%s", input); 

//get the first token 
token = strtok(input, " "); 

int i=0; 
//walk through other tokens 
while(token != NULL) { 
    argv[i] = token; 
    i++; 
    token = strtok(NULL, " "); 
    } 
argv[i] = NULL; //argv ends with NULL 
+0

중복 가능성 - ([C 문자열 배열로 분할 문자열] http://stackoverflow.com/questions/11198604/c-split- string-into-an-array-of-strings) – indiv

+0

사용자 데이터를 읽고 사용자 데이터를 토큰으로 분할하는 것과 같은 몇 가지 문제를 처리해야합니다. 루프에서''scanf'에서''% s "'포맷을 사용하면 둘 모두를 적절히 처리해야합니다. –

+0

"제대로 작동하지 않는다"는 것이 여기에 있음을 설명 할 수 있습니까? 루프는 입력 문자 배열을 따라 걷고 있으며, '\ 0'으로 찾은 각 공백을 덮어 쓰고 각 토큰의 시작 부분에 포인터를 저장합니다. 당신이 요구하는 것처럼 들리네. – iwolf

답변

0

난 그냥 내 문제를 알아 냈다고 생각 : 내가 scanf() 대신 getsf()를 사용해야합니다, 왜냐하면 scanf()는 첫 번째 단어를 얻을 때까지 공간까지, 나는 문자열을 포함 할 수 있기를 원합니다. 여러 단어는 공백으로 구분됩니다.

2

(덧붙여서,이 execvp(argv[0],argv);을 호출하는 프로그램의 일부이다) [I] :

token = strtok(input, " "); 

int i=0; 
//walk through other tokens 
while(token != NULL) { 
    argv[i] = malloc(strlen(token) + 1); 
    strncpy(argv[i], token, strlen(token)); 
    //argv[i] = token; 
    i++; 
    token = strtok(NULL, " "); 
    } 
argv[i] = NULL; //argv ends with NULL 
+0

아니요, 포인터를위한 공간 만 할당 할 필요는 없습니다. 'strtok (3)'은 문자열에있는 첫 번째'char'에'\ 0'을 넣고, 두 번째 문자열 매개 변수에'strtok (3)'에 속하는 원래의 문자열을 살펴 봅니다. 'malloc()'을 보존/저장하려면 원래의 문자열'input' 또는'dup (3)'을 사용하면됩니다. 또한, 당신의 예제에서, 당신은'strdup (3)'을 호출 할 수 있는데, malloc과'strcpy (3)'둘 다 수행합니다. –

0

나는 당신이 원하는 것이라고 생각하는 예를 만들었습니다. 나는 전체 문자열에 대해 하나의 malloc(3)을 사용했고, 함수에서 얻을 수있는 포인터 배열에 대해서는 또 다른 문자열을 사용했다.

또한 strtok(3)이라는 두 번째 매개 변수가 전달되어 더 많은 유연성을 제공합니다 (쉘은 일반적으로 IFS 환경 변수의 내용을 사용하여 인수를 구분하므로 쉘과 동일한 알고리즘을 사용할 수 있습니다). " \n\t"을 사용해야한다고 생각합니다. 가장 작은. 그것은 main() 테스트 기능을 가지고 있으므로 당신의 목적에 완벽합니다.

#include <assert.h> /* man assert(3) */ 
#include <stdlib.h> /* malloc lives here */ 
#include <string.h> /* strtok, strdup lives here */ 
#include <stdio.h> /* printf lives here */ 

char **split(const char *str, const char *delim) 
{ 
    char *aux; 
    char *p; 
    char **res; 
    char *argv[200]; /* place for 200 words. */ 
    int n = 0, i; 

    assert(aux = strdup(str)); 
    for (p = strtok(aux, delim); p; p = strtok(NULL, delim)) 
     argv[n++] = p; 
    argv[n++] = NULL; 
    /* i'll put de strdup()ed string one place past the NULL, 
    * so you can free(3), once finished */ 
    argv[n++] = aux; 
    /* now, we need to copy the array, so we can use it outside 
    * this function. */ 
    assert(res = calloc(n, sizeof (char *))); 
    for (i = 0; i < n; i++) 
     res[i] = argv[i]; 
    return res; 
} /* split */ 

int main() 
{ 
    char **argv = 
     split("Put each word of a string into array in C", " "); 
    int i; 

    for (i = 0; argv[i]; i++) 
     printf("[%s]", argv[i]); 
    puts(""); /* to end with a newline */ 

    free(argv[i+1]); 
    free(argv); 
} /* main */ 

샘플 코드는 출력 :

$ pru 
[Put][each][word][of][a][string][into][array][in][C] 
관련 문제