基本上我需要编写一个split函数,目前我需要知道如何使用指向 s 的字符来填充子串。
我有:
char *s = "--ab--c--";
char **substrings;
int split(char *s, int start, char sep, char **substrings, int max)
我不知道*s
和**substrings
的定义是否正确。
我需要指定*s
的指针,例如**substrings
将包含:
{ "", "ab", "c", "" }
子串的正式定义
substrings - the array to populate with pointers to substrings of s
我不知道,我用Google搜索了双尖,无法弄明白。
*s
的大小未知,**substrings
的数量仅在程序执行时才知道。
我是C的新手,但我认为我需要这样的东西:
substrings[0][0] = "";
substrings[1][0] = "a";
substrings[1][1] = "c";
substrings[2][0] = "c";
substrings[3][0] = "a";
答案 0 :(得分:1)
目前还不清楚split()
例程的语义是什么,但我猜你的substrings
应该是指针的数组:
#define MAX_TOKENS 16 /* for example */
char* substrings[MAX_TOKENS];
split(s, ..., substrings, MAX_TOKENS);
答案 1 :(得分:0)
在运行时,您知道您不能拥有比s中包含字符更多的子字符串。因此,你可以为那么多的子串调用足够的空间,只使用你需要的空间。
#include <stdlib.h>
#include <string.h>
char** substrings = (char**)calloc(strlen(s), sizeof(char));
if (substrings == NULL) exit(1);
// Split here
此时,您有一个数据结构,其中包含strlen(s)字符串的指针。拆分字符串时,将迭代这些指针,并将每个指针分配给您找到的新子字符串。
答案 2 :(得分:0)
由于您事先并不知道每个子字符串的子串数或大小,我建议使用calloc
考虑最坏情况,这是:
substrings = calloc(strlen(s), strlen(s)*sizeof(char));
sizeof(char)
应为1,但我只是出于教学原因而将其包括在内。
关于实施split
功能的最佳方式,我认为最佳解决方案是使用strchr
,它类似于:
int split(char *s, int start, char sep, char **substrings, int max)
{
char *old, *sp;
int i=0;
old=s;
sp=strchr(old,sep);
while (sp!=NULL && i < max)
{
if(0 < (sp-old))
strncpy(substrings+i++, old, sp - old);
old = sp+1;
sp=strchr(old,sep);
}
// Last sub string
if(0 < (s+strlen(s)-old))
strncpy(substrings+i++, old, s+strlen(s)-old);
return i;
}
对于您的建议输入,此解决方案将转储包含以下内容的数组:{"ab","c"}
。
我假设max
定义了允许的最大子串数,并且substrings
中的每个元素都有足够的空间来存储相应的子字符串(这两个条件都满足之前提出的calloc
)。