나는 당신이 원하는 것이라고 생각하는 예를 만들었습니다. 나는 전체 문자열에 대해 하나의 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]
의
중복 가능성 - ([C 문자열 배열로 분할 문자열] http://stackoverflow.com/questions/11198604/c-split- string-into-an-array-of-strings) – indiv
사용자 데이터를 읽고 사용자 데이터를 토큰으로 분할하는 것과 같은 몇 가지 문제를 처리해야합니다. 루프에서''scanf'에서''% s "'포맷을 사용하면 둘 모두를 적절히 처리해야합니다. –
"제대로 작동하지 않는다"는 것이 여기에 있음을 설명 할 수 있습니까? 루프는 입력 문자 배열을 따라 걷고 있으며, '\ 0'으로 찾은 각 공백을 덮어 쓰고 각 토큰의 시작 부분에 포인터를 저장합니다. 당신이 요구하는 것처럼 들리네. – iwolf