使用另一个字符串作为分隔符将一个字符串分解为令牌列表?

泽鲁诺

假设我有以下字符串:

char *myTestString = "Hello AND test AND test2";

我想打破这种分解成集合{ Hellotesttest2},我终于可以遍历。

或者我有

char *myTestString2 = "Hi AND there AND test AND test2";

我想打破这种分解成集合{ Hitheretesttest2},我以后可以遍历。

我如何使用C实现呢?

编辑:另一个示例是拆分"Hello there AND test"应给出集合{ Hello theretest}。为了澄清"AND"起见,这里是定界符。

来自莫斯科的弗拉德

这个给你。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char ** split( const char *s1, const char *s2 )
{
    char **tokens = malloc( sizeof( char * ) );
    int success = tokens != NULL;

    if ( success )
    {
        const char *delim = " \t";
        *tokens = NULL;

        for ( size_t n = 1, len = strlen( s2 ); success && *s1; )
        {
            s1 += strspn( s1, delim );

            if ( *s1 )
            {
                const char *p = s1;

                s1 += strcspn( s1, delim );

                if ( strncmp( p, s2, len ) != 0 )
                {
                    char **tmp = realloc( tokens, ( n + 1 ) * sizeof( char * ) );

                    if ( ( success = tmp != NULL ) )
                    {
                        tokens = tmp;

                        success = ( tokens[n-1] = calloc( 1, s1 - p + 1 ) )  != NULL;
                        strncpy( tokens[n-1], p, s1 - p );
                        tokens[n] = NULL;
                        ++n;
                    }

                    if ( !success )
                    {
                        for ( size_t i = 0; i < n; i++ ) free( tokens[i] );
                        free( tokens );
                    }
                }
            }
        }
    }       

    return tokens;
}

int main(void) 
{
    const char *s1 = "Hi AND there AND test AND test2";
    const char *s2 = "AND";

    char **tokens = split( s1, s2 );

    if ( tokens != NULL )
    {
        for ( char **p = tokens; *p != NULL; ++p )
        {
            puts( *p );
        }

        char **p = tokens;
        do
        {
            free( *p );
        } while ( *p++ != NULL );

        free( tokens );
    }

    return 0;
}

程序输出为

Hi
there
test
test2

如果内存分配不成功,该函数将返回NULL。否则,它将返回一个指向元素类型为char *的数组的指针,该数组的最后一个元素为空指针。

源字符串中的单词由制表符和空格分隔。您可以根据需要更改定界符。

在对我以前的解决方案发表评论后,您似乎需要以下内容

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char ** split( const char *s1, const char *s2 )
{
    char **tokens = malloc( sizeof( char * ) );
    int success = tokens != NULL;

    if ( success )
    {
        const char *delim = " \t";
        *tokens = NULL;

        for ( size_t n = 1, len2 = strlen( s2 ); success && *s1; )
        {
            for ( int empty = 1; empty; ) 
            {
                s1 += strspn( s1, delim );
                if ( ( empty = strncmp( s1, s2, len2 ) == 0 ) )
                {
                    s1 += len2;
                }
            }               

            if ( *s1 )
            {
                const char *p = strstr( s1, s2 );

                size_t len1 = p == NULL ? strlen( s1 ) : p - s1;

                char **tmp = realloc( tokens, ( n + 1 ) * sizeof( char * ) );

                if ( ( success = tmp != NULL ) )
                {
                    tokens = tmp;

                    success = ( tokens[n-1] = calloc( 1, len1 +  1 ) )  != NULL;
                    strncpy( tokens[n-1], s1, len1 );
                    tokens[n] = NULL;
                    ++n;

                    s1 += p == NULL ? len1 : len1 + len2; 
                }

                if ( !success )
                {
                    for ( size_t i = 0; i < n; i++ ) free( tokens[i] );
                    free( tokens );
                }
            }
        }
    }       

    return tokens;
}

int main(void) 
{
    const char *s1 = "Hi there AND test test2";
    const char *s2 = "AND";

    char **tokens = split( s1, s2 );

    if ( tokens != NULL )
    {
        for ( char **p = tokens; *p != NULL; ++p )
        {
            puts( *p );
        }

        char **p = tokens;
        do
        {
            free( *p );
        } while ( *p++ != NULL );

        free( tokens );
    }

    return 0;
}

程序输出为

Hi there 
test test2

也许您还需要删除提取的子字符串的尾随空白,希望您可以自己做。:)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用另一个字符串作为分隔符拆分字符串(例如从 123:1 拆分 :1)

c# 使用另一个字符串作为分隔符拆分字符串并将分隔符作为拆分字符串的一部分包含在内

如何将一个字符串分解,并保持分隔符“=”

如何使用另一个字符串作为密码来加密/解密一个字符串?

每多个分隔符拆分一个字符串

使用动态中的指针将一个字符串复制到另一个字符串

使用 PHP 将一个字符串与另一个字符串匹配

使用C ++将一个字符串替换为另一个字符串

将一个字符串插入另一个

如何拆分字符串,其中一个字符是分隔符,另一个是内容

C ++将字符串除以另一个字符串作为整体

JavaScript 插入分隔符并将数组内容连接为一个字符串

将列表中的字符串项与另一个字符串合并

如何根据替换字符将一个字符串的值替换为另一个字符串?

将一个字符串在 r 中的多个分隔符处拆分为多行

计算一个字符串在另一个字符串中每个字符的出现次数

检查Python列表项是否在另一个字符串中包含一个字符串

如何将一个字符串数组存储到另一个字符串数组中?

将一个字符串交错到另一个字符串所需的最小子序列数

将一个字符串添加到另一个字符串

将一个字符串插入另一个字符串时出错

如何将一个字符串插入另一个字符串?

如何将一个字符串值与另一个字符串值进行比较?

如何用webpack将一个字符串替换为另一个字符串?

如何将一个字符串与另一个字符串匹配并为其返回 true?

将一个字符串与另一个字符串进行比较的最佳方法是什么?

将整数从一个字符串移动到另一个字符串?

swift:如何将一个字符串从textField分配给另一个字符串?

将表格分隔符更改为另一个字符