我们有一个学校作为一个特定的字符串拆分功能 给出函数的头和参数不能改变它们。 此函数应将原始分隔符拆分为字符串数组,该字符串存储未包含的字符串分隔符的每个部分,并在每个分隔符增加大小的附加项中
void stringSplit(const char *original, char result[50][256], int* size, char delim){
size_t begin = 0;
if(!original){
return;
}
for(size_t i=0; i<strlen(original);i++ ){
if (original[i] == delim){
int str_begin = 0;
for( ; begin < i; begin++ ){
result[*size][str_begin] = original[begin];
str_begin++;
}
(*size)++;
begin ++ ;
}
}
}
答案 0 :(得分:0)
这个想法没问题,但你有几个错误:
您的字符串副本不是'\0'
- 已终止。你也没有参加
多个分隔符连续跟随时的帐户。
如果您不被允许使用
像strchr
和strncpy
这样的功能,你可以这样做:
size_t str_begin = 0;
*size = 0; // the user may have passed an uninitialized int variable
for(size_t i = 0; original[i] && *size < 50; ++i)
{
if(original[i] == delim)
{
size_t sublen = i - str_begin;
if(sublen == 0)
{
// skip delimiter, last character was also a
// delimiter and/or the first character in
// original is a delimiter
str_begin++;
continue;
// or if you want to have empty words instead of skipping
// results[*size] = 0;
// (*size)++;
}
if(sublen > 256)
sublen = 256;
for(size_t j = 0; j < sublen; ++j)
result[*size][j] = original + str_begin + j;
result[*size][j] = 0; // \0-terminating string
(*size)++;
str_begin = i + 1; // updating str_begin to next char
}
}
答案 1 :(得分:0)
这样做的直接方式是 - 正如Barmar建议的那样 - 制作原始字符串的副本,然后使用strtok()
和strcpy
。
或者,您可以在循环中使用strchr
来查找分隔符,并使用memcpy
来复制先前分隔符和下一个分隔符之间的内存。请参阅以下代码,该代码还考虑了结果数组的边界:
void stringSplit(const char *original, char result[50][256], int *size, char
delim)
{
if(!original){
return ;
}
*size = 0;
const char* nextDelim;
const char* prevDelim = original;
do {
nextDelim = strchr(prevDelim,delim);
size_t len = nextDelim ? (nextDelim - prevDelim) : strlen(prevDelim);
if (len >= 256) {
len = 256-1;
}
memcpy(result[*size],prevDelim,len);
result[*size][len] = '\0';
(*size)++;
prevDelim = nextDelim ? nextDelim+1 : NULL;
}
while(nextDelim && *size < 50);
}
int main() {
char result[50][256];
int size;
stringSplit("Hello, this, is", result, &size, ',');
return 0;
}
希望它有所帮助。