C:使用分隔符将字符串拆分为char [] [],同时保存分隔符

时间:2014-03-04 10:42:34

标签: c arrays string

我有字符串

"this***is**my-beautiful--string"

我想把它分成

{"this", "***", "is", "**", "my", "-", "beautiful", "--", "string"}

有两个分隔符"*-",因此我可以使用strtok()来查找单词

但是如何将分隔符添加到数组中呢?

4 个答案:

答案 0 :(得分:2)

你不能在这里使用strtok,因为它通过用空字符覆盖它们来“破坏”输入字符串中的delmiters。您可以使用strspnstrcspn这样的功能:

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

int xmain() {
    const char *str = "this***is**my-beautiful--string";
    const char *delim = "*-";

    const char *p = str;
    int mode = strchr(delim, *str) == 0;

    while (*p) {
        int n;

        if (mode) {
            n = strcspn(p, delim);
        } else {
            n = strspn(p, delim);
        }
        printf("'%.*s'\n", n, p);
        mode = !mode;
        p += n;
    }

    return 0;
}

mode确定我们是在寻找分隔符还是两者之间的文本。基于此,我们必须在有效的delmiters字符串中查找包含的最长字符(mode == 0)或不包括(mode == 1)。

此代码可以在字符串文字上运行。但是,它不会产生零终止的C字符串,而是常量字符串和字符串长度的组合。如果需要将结果保存在数组中,我建议将它们保存为指针加长度数据的结构。

您可以通过将mode分别初始化为1或0来强制使用(可能为空)令牌或分隔符启动令牌。

答案 1 :(得分:0)

这就是你想要的:

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

#define PARSED_CHUNKS 4
struct parsed {
    char **data;
    size_t count;
    size_t alloc;
};

void allocate(struct parsed *p)
{
    if (p->count == p->alloc)
    {
        p->alloc += PARSED_CHUNKS;
        p->data = realloc(p->data, p->alloc * sizeof(char *));
        if (p->data == 0)
        {
            fprintf(stderr, "no memory\n");
            exit(1);
        }
    }
}

int main()
{
    const char *str = "this***is**my-beautiful--string";
    const char *start;
    unsigned int i;
    struct parsed p;

    memset(&p, 0, sizeof(p));

    for(;;)
    {
        allocate(&p);

        start = str;
        while(*str != '*' && *str != '-' && *str != '\0')
            str ++;
        if (str-start > 0)
            p.data[p.count++] = strndup(start, str-start);
        if (*str == '\0')
            break;

        allocate(&p);

        start = str;
        while(*str == '*' || *str == '-' && *str != '\0')
            str ++;
        p.data[p.count++] = strndup(start, str-start);
        if (*str == '\0')
            break;

    };

    for (i = 0; i < p.count; i++)
    {
        printf("%d: %s\n", i, p.data[i]);
    }

    return 0;
}

答案 2 :(得分:0)

您也可以使用此程序轻松理解。

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
main()
{
    int i = 0 ,j = 0 ,k = 0,l=0;
    char string[]="this***is**my-beautiful--string";
    char *string1[9],tem[20];
    for ( i = 0 ; string[i] != '\0' ; i++ )
    {
            if ( isalpha(string[i] ) )
            {
                    if(l != 0)
                    {
                    tem[l] = '\0';
                    string1[k]=(char *)malloc(strlen(tem)+1);
                    strcpy(string1[k],tem);
                    k++;
                    l=0;
                    }
                    tem[j++]=string[i];
            }
            else
            {
                    if(j != 0)
                    {
                            tem[j] = '\0';
                            string1[k]=(char *)malloc(strlen(tem)+1);
                            strcpy(string1[k],tem);
                            k++;
                            j=0;
                    }
                            tem[l++]=string[i];
             }             
     }                                                  
    for ( i = 0 ; i < k ; i++ )
            printf("split string is :%s\n",string1[i]);
 }

答案 3 :(得分:-1)

你可以像这样使用strtok()

char line[] = "this***is**my-beautiful--string";
char *token;
char *deli;
deli="*-";

token = strtok(line, deli);

while(token!=NULL){
    printf("%s",token);
    token = strtok(NULL,deli);
}