在C中使用多个分隔符拆分字符串[重复]
Posted
技术标签:
【中文标题】在C中使用多个分隔符拆分字符串[重复]【英文标题】:Spilting strings in C with mulitple delimiters [duplicate] 【发布时间】:2022-01-13 17:40:57 【问题描述】:所以我需要拆分给定的字符串:
const char *inputs[] = "111adbhsd111gfhds","goal!","zhd!111oosd","111let111";
输出:
char *outputs[]="adbhsd","gfhds","goal!","zhd!","oosd","let"
分隔符在哪里: "111" 。 我尝试使用 strtok ,但由于分隔符是多个字符,它不起作用!
任何想法,它如何提供输出,都会有所帮助!
到目前为止我做了什么:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
size_t split(
char **outputs, // outputs
const char *separator, // the delimiter
const char **inputs,
size_t num_inputs // no. of input strings, given in input array
)
size_t num_outputs = 0;
int l= 0;
for(size_t i = 0; i < num_inputs ; i++)
if(strstr(*(inputs+i), separator) != NULL) // to check, if the string of the given input array has the delimiter
char* pos = strstr( *(inputs+i), separator);
//having problem in this part
else
strcpy( outputs[l] , *(inputs+i));;
l++;
num_outputs++;
return num_outputs;
int main()
const char *inputs[] =
"111abdhsd111gfhds",
"goal!",
"zhd!111oosd",
"111let111"
;
char *outputs[] =malloc(1000),malloc(1000),malloc(1000),malloc(1000),malloc(1000),malloc(1000);
split(outputs, "111", inputs, 4);
for(int i =0; i < 6; i++)
printf("The output[%d] is : %s" ,i, outputs[i]);
free(outputs[i]);
return 0;
【问题讨论】:
分割字符串需要找到分隔符;你做了什么来解决这部分问题? @SJoNIne 我有个主意!您需要为每个提取的字符串动态分配内存。 查找strstr()
。
@AndrewHenle: Indeed.
事实上,是的,@FredLarson:***.com/questions/70276920/…(需要 20K+)。发帖人将其删除,然后发布了一份新副本(尽管稍作修改)。
【参考方案1】:
注意:以下答案是指revision 2 of the question,这是在OP向已经使用函数strstr
的问题添加代码之前。
如果字符串由子字符串而不是单个字符分隔,则可以使用函数strstr
查找分隔符子字符串:
#include <stdio.h>
#include <string.h>
int main( void )
const char input[] = "111adbhsd111gfhds", *p = input;
const char *const delim = "111";
//remember length of delimiter substring
const size_t delim_length = strlen( delim );
for (;;) //infinite loop, equivalent to "while ( 1 )"
//attempt to find next delimiter substring
const char *q = strstr( p, delim );
//break loop if this is last token
if ( q == NULL )
break;
//print token
if ( q == p )
printf( "Found token: <empty>\n" );
else
printf( "Found token: %.*s\n", (int)(q-p), p );
//make p point to start of next token
p = q + delim_length;
//print last token
printf( "Found token: %s\n", p );
这个程序有以下输出:
Found token: <empty>
Found token: adbhsd
Found token: gfhds
由于示例输入以分隔符 "111"
开头,因此第一个标记为空。如果您不想打印空标记,您可以简单地删除代码中的第一个 printf
语句。
这不是您问题的完整解决方案,因为您的任务似乎由多个输入字符串组成,而不仅仅是一个,并且写入输出数组而不是打印到屏幕上。根据community guidelines for homework questions,我暂时不会为您的问题提供完整的解决方案。相反,目前,我只提供了一个解决方案来解决您所说的问题(使用带有子字符串分隔符的strtok
)。如有必要,我可以稍后添加其他代码。
【讨论】:
从问题中的示例来看,空的初始和最终标记似乎应该被忽略。 @chqrlie:我认为假设应该忽略空令牌是不安全的,即使 OP 的示例暗示应该忽略。尽管如此,我已经编辑了我的答案,声明可以简单地删除相应的prinf
语句,如果这是 OP 想要的。
@chqrlie true,我们应该忽略空字符串以上是关于在C中使用多个分隔符拆分字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章