我试图将一个字符串(由用户在运行时键入)分成单词(用空格分隔),然后将每个单词放入一个不同的插槽中。因此,例如,如果我使用字符串"hello world"
,array[0]
将包含"hello"
,array[1]
将包含"world"
。最后一个广告位(在本例中为array[2]
)将包含NULL
。这是我到目前为止所做的,似乎没有正常工作。任何帮助,将不胜感激。 (顺便说一句,这是一个会调用execvp(argv[0],argv);
)
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 :(得分:3)
您需要为每个argv [i]分配内存并将当前令牌复制到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
答案 1 :(得分:0)
我已经创建了一个我认为你想要的例子。我整体上使用了一个malloc(3)
字符串和另一个字符串,用于从函数中获取的指针数组。
此外,传递strtok(3)
的第二个参数以提供更大的灵活性(shell通常使用IFS环境变量的内容来分隔参数,因此您可以使用与shell相同的算法)我认为您应该至少使用" \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]
答案 2 :(得分:-1)
我想我只是想出了我的问题:我需要使用gets()而不是scanf(),因为scanf()只获取第一个单词,直到空格,而我希望能够得到一个字符串包含由空格分隔的多个单词。