我想在C中分割一个字符串。
My String由我的Struct定义:
struct String
{
char *c;
int length;
int maxLength;
}
然后我有一个执行拆分的功能。也许C有这样做的东西,但是虽然我想要自己的,但到目前为止我还没有找到任何可以做到的东西。
String ** spliter(String *s)
{
if(s == NULL)
return NULL;
// set of splitters: {'\n', ' '}
}
输入看起来像这样:This is Sparta.
然后我想返回一个指向每个字符数组的指针。
*p1 = This
*p2 = is
*p3 = Sparta.
如果这有意义,我想要一个指针数组,每个指针都指向一个字符数组。
当我增加每个字符数组的大小时,我将不得不重新分配字符串。可能我最大的问题是想象指针是如何工作的。
类似问题:c splitting a char* into an char**
那么,我该如何做呢?
答案 0 :(得分:0)
如果您没有使用* nix,那么您正在寻找strtok
,请查看man 3 strtok
或here。
您可以这样使用它:(假设您可以自己编写add_string
代码。)
String ** spliter(String *s)
{
if(s == NULL)
return NULL;
String **return_strings = NULL;
char *delim = " \n";
char *string = strtok(s, delim);
int i = 0;
for(i = 0; add_string(return_strings, string, i) != -1; i++) {
string = strtok(NULL, delim);
}
return strings;
}
请注意,如果您需要保存原始字符串(strtok
修改其工作的字符串),则需要在原始字符串上调用strdup
,然后对副本进行操作。< / p>
编辑:OP说他在思考这些指针时遇到了麻烦。使用上面的代码示例,add_string
只需要担心处理一串字符,而不是指向字符指针的指针数组。所以它可能看起来像这样:
int add_string(String **strings, char *s, int len)
{
if(s == NULL)
return -1;
String *current_string = NULL;
strings = realloc(strings, sizeof(String) * (len + 1));
current_string = strings[len];
/* fill out struct fields here */
}
答案 1 :(得分:0)
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
string test = "aa aa bbc cccd";
vector<string> strvec;
string strtemp;
string::size_type pos1, pos2;
pos2 = test.find(' ');
pos1 = 0;
while (string::npos != pos2)
{
strvec.push_back(test.substr(pos1, pos2 - pos1));
pos1 = pos2 + 1;
pos2 = test.find(' ', pos1);
}
strvec.push_back(test.substr(pos1));
vector<string>::iterator iter1 = strvec.begin(), iter2 = strvec.end();
while (iter1 != iter2)
{
cout << *iter1 << endl;
++iter1;
}
return 0;
}
答案 2 :(得分:0)
这是一个例子:
String ** spliter(String *s)
{
int i;
int j;
char *p1;
char *p2;
char *p3;
i = 0;
j = 0;
if(s == NULL)
return NULL;
p1 = malloc(sizeof(*p1) * strlen(s));
p2 = malloc(sizeof(*p2) * strlen(s));
p3 = malloc(sizeof(*p3) * strlen(s));
while (s[i] != ' ')
{
p1[j++] = s[i];
i++;
}
i++;
j = 0;
while (s[i] != ' ')
{
p2[j++] = s[i];
i++;
}
i++;
j = 0;
while (s[i] != '\0')
{
p3[j++] = s[i];
i++;
}
printf("%s\n", p1);
printf("%s\n", p2);
printf("%s\n", p3);
}
答案 3 :(得分:0)
答案 4 :(得分:0)
添加strdup和strtok可以处理字符串的副本。 split()调用比其他spliter()示例更通用,但在复制时使用strtok执行相同的操作。
char **
split(char **result, char *w, const char *src, const char *delim)
{
int i=0;
char *p;
strcpy(w,src);
for(p=strtok(w, delim) ; p!=NULL; p=strtok('\0', delim) )
{
result[i++]=p;
result[i]=NULL;
}
return result;
}
void display(String *p)
{
char *result[24]={NULL};
char *w=strdup(p->c);
char **s=split(result, w, p->, "\t \n"); split on \n \t and space as delimiters
for( ; *s!=NULL; s++)
printf("%s\n", *s);
free(w);
}