在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中使用多个分隔符拆分字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Python中使用多个分隔符拆分字符串[重复]

如何拆分字符串但在开头保留分隔符[重复]

如何使用分隔符数组在 Java 中使用多个分隔符拆分字符串? [复制]

将分隔字符串拆分为存储过程中的变量[重复]

在拆分中使用多个分隔符[重复]

如何在python中拆分具有多个分隔符的字符串? [复制]