我正在尝试将 a 转换Char*
为Char**
.
例如"echo Hello World"
会变成{"echo", "Hello", "World"}
我知道,我可以从Char*
with中得到单个单词strtok()
。
但是我在初始化时遇到了问题Char**
,因为Char*
它的大小未知,并且单个单词的大小也未知。
您char**
只是指向第一个指针char *
(或 char 指针数组的开头)。分配char*[]
(它与!!不同char**
)可能是一个更大的问题。你应该使用malloc
这个任务。如果你事先不知道char*
s 的个数,你可以猜测一些大小,用NULL
s 填充它,并realloc
在需要时调用。
您可以在您的字符串上运行并搜索“”(空格字符),然后您找到的每个空格都可以使用该函数获取子字符串,strncpy
以获取当前空间索引和最后一个空间索引之间的字符串。您创建的每个字符串都可以存储在“动态”数组中(使用 malloc 和 realloc)。
对于第一个子字符串,您的起始索引为 0,在字符串的末尾,您将获得最后一个空间索引和字符串长度之间的最后一个子字符串。
Google 搜索中的第一个结果为您提供了一个可以修改的示例:
/* strtok example */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main ()
{
// allocate 10 strings at a time
int size = 10;
int i = 0;
char str[] ="echo Hello World";
char** strings = malloc(size * sizeof(char*));
char* temp;
printf ("Splitting string \"%s\" into tokens:\n",str);
temp = strtok (str," ");
while (temp != NULL)
{
strings[i++] = temp;
temp = strtok (NULL, " ,.-");
if(i % size == 0)
//allocate room for 10 more strings
strings = realloc(strings, (i+size) * sizeof(char*));
}
int j;
for(j = 0; j < i; j ++)
{
printf ("%s\n",strings[j]);
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
size_t word_count(const char *str){
enum { out, in } status;
size_t count = 0;
status = out;
while(*str){
if(isspace(*str++)){
status = out;
} else if(status == out){
status = in;
++count;
}
}
return count;
}
int main(void){
char original[] = "echo Hello World";
size_t i, size = word_count(original);
char *p, **words = (char**)malloc(sizeof(char*)*size);
for(i = 0, p = original;NULL!=(p=strtok(p, " \t\n")); p = NULL)
words[i++] = p;
//check print
printf("{ ");
for(i = 0;i<size;++i){
printf("\"%s\"", words[i]);
if(i < size - 1)
printf(", ");
}
printf(" }\n");
return 0;
}