我正在尝试将Char*
转换为Char**
。
e.g。 "echo Hello World"
将成为{"echo", "Hello", "World"}
我知道,我可以使用Char*
从strtok()
获取单个字词。
但我在初始化Char**
时遇到问题,因为Char*
的大小未知,单个单词的大小也是未知的。
答案 0 :(得分:0)
你的char**
只是指向第一个char *
(或者是char指针数组的开头)的指针。 char*[]
的分配(它的不与char**
相同!!)可能是一个更大的问题。
您应该使用malloc
执行此任务。如果您事先不知道char*
的数量,则可以猜测一些尺寸,填写NULL
并在需要时致电realloc
。
答案 1 :(得分:0)
你可以运行你的字符串并搜索''(空格字符),然后你找到的每个空格都可以用函数strncpy
得到子字符串,以获得当前空间索引和最后一个空格索引之间的字符串。您创建的每个字符串都可以存储在“动态”数组中(使用malloc和realloc)
对于第一个子字符串,您的起始索引为0,并且在字符串的末尾,您将获得最后一个空格索引和字符串长度之间的最后一个子字符串。
答案 2 :(得分:0)
Google search中的第一个结果为您提供了一个可以修改的示例:
/* 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;
}
答案 3 :(得分: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;
}