首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么用一个分隔符将一个string语句分开来

2013-04-20 
如何用一个分隔符将一个string语句分开来例如string a aaa bbb ccc有没有哪个函数能将他分为aaa bbb c

如何用一个分隔符将一个string语句分开来
例如string a = "aaa bbb ccc"
有没有哪个函数能将他分为aaa bbb ccc3段放到3个string 中的?
[解决办法]
原型

char *strtok(char s[], const char *delim);
编辑本段
功能

分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
编辑本段
说明

strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包涵的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。
编辑本段
返回值

从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。
所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。
[解决办法]
自己实现个split放vector里面吧,毕竟大多数情况下,分割之前你不知道会分成多少个

#include <iostream>
#include <string>
#include <vector>
using namespace std;

void split(vector<string> &v, string s, string delimitor=" ")
{
    size_t pos = s.find(delimitor);
    size_t last_pos = 0;
    v.clear();
    while (pos!=string::npos)
    {
        v.push_back(s.substr(last_pos,pos-last_pos));
        last_pos = pos+delimitor.size();
        pos = s.find(delimitor,last_pos);
    }
    if (last_pos<s.size()) v.push_back(s.substr(last_pos));
}

int main()
{
    string a = "aaa bbb cde";
    vector<string> v;
    split(v,a," ");
    for (size_t i=0;i<v.size();i++) cout << i << "-" << v[i] << " ";
    cout << endl;
    return 0;
}

[解决办法]
#include <stdio.h>
#include <string.h>
char string[80];
char seps1[3];
char seps2[3];
char *token;
char *zzstrtok (
    char *string,
    const char *control1,//连续出现时视为中间夹空token
    const char *control2 //连续出现时视为中间无空token
    )
{
    unsigned char *str;
    const unsigned char *ctrl1 = (const unsigned char *)control1;
    const unsigned char *ctrl2 = (const unsigned char *)control2;
    unsigned char map1[32],map2[32];
    static char *nextoken;
    static char flag=0;
    unsigned char c;
    int L;

    memset(map1,0,32);
    memset(map2,0,32);
    do {
        map1[*ctrl1 >> 3] 
[解决办法]
= (1 << (*ctrl1 & 7));
    } while (*ctrl1++);


    do {
        map2[*ctrl2 >> 3] 
[解决办法]
= (1 << (*ctrl2 & 7));
    } while (*ctrl2++);

    if (string) {
        if (control2[0]) {
            L=strlen(string);
            while (1) {
                c=string[L-1];
                if (map2[c >> 3] & (1 << (c & 7))) {
                    L--;
                    string[L]=0;
                } else break;
            }
        }
        if (control1[0]) {
            L=strlen(string);
            c=string[L-1];
            if (map1[c >> 3] & (1 << (c & 7))) {
                string[L]=control1[0];
                string[L+1]=0;
            }
        }
        str=(unsigned char *)string;
    }
    else str=(unsigned char *)nextoken;

    string=(char *)str;
    while (1) {
        if (0==flag) {
            if (!*str) break;
            if (map1[*str >> 3] & (1 << (*str & 7))) {
                *str=0;
                str++;
                break;
            } else if (map2[*str >> 3] & (1 << (*str & 7))) {
                string++;
                str++;
            } else {
                flag=1;
                str++;


            }
        } else if (1==flag) {
            if (!*str) break;
            if (map1[*str >> 3] & (1 << (*str & 7))) {
                *str=0;
                str++;
                flag=0;
                break;
            } else if (map2[*str >> 3] & (1 << (*str & 7))) {
                *str=0;
                str++;
                flag=2;
                break;
            } else str++;
        } else {//2==flag
            if (!*str) return NULL;
            if (map1[*str >> 3] & (1 << (*str & 7))) {
                str++;
                string=(char *)str;
                flag=0;
            } else if (map2[*str >> 3] & (1 << (*str & 7))) {
                str++;
                string=(char *)str;
            } else {
                string=(char *)str;
                str++;
                flag=1;
            }
        }
    }
    nextoken=(char *)str;

    if (string==(char *)str) return NULL;
    else             return string;
}
void main()
{
   strcpy(string,"A \tstring\t\tof ,,tokens\n\nand some  more tokens, ");
   strcpy(seps1,",\n");strcpy(seps2," \t");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {


      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"1234
[解决办法]
 LIYI
[解决办法]
China 
[解决办法]
 010 
[解决办法]
201110260000
[解决办法]
OK");
   strcpy(seps1,"
[解决办法]
");strcpy(seps2," ");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"1234
[解决办法]
LIYI
[解决办法]
010
[解决办法]
201110260000
[解决办法]
OK");
   strcpy(seps1,"");strcpy(seps2,"
[解决办法]
");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"1234
[解决办法]
LIYI
[解决办法]
010
[解决办法]
201110260000
[解决办法]
OK");
   strcpy(seps1,"
[解决办法]
");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"a");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"a,b");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);


      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"a,,b");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,",a");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"a,");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,",a,,b");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,",,a,,b,,");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,",");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,",,");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,",,,");
   strcpy(seps1,",");strcpy(seps2," ");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }
}
//
//[A      string          of ,,tokens
//
//and some  more tokens,]
//Tokens:
// <A>, <string>, <of>, <>, <tokens>, <>, <and>, <some>, <more>, <tokens>, <>,


//[1234
[解决办法]
 LIYI
[解决办法]
China 
[解决办法]
 010 
[解决办法]
201110260000
[解决办法]
OK]
//Tokens:
// <1234>, <LIYI>, <China>, <010>, <201110260000>, <OK>,
//[1234
[解决办法]
LIYI
[解决办法]
010
[解决办法]
201110260000
[解决办法]
OK]
//Tokens:
// <1234>, <LIYI>, <010>, <201110260000>, <OK>,
//[1234
[解决办法]
LIYI
[解决办法]
010
[解决办法]
201110260000
[解决办法]
OK]
//Tokens:
// <1234>, <LIYI>, <>, <010>, <201110260000>, <OK>,
//[a]
//Tokens:
// <a>,
//[a,b]
//Tokens:
// <a>, <b>,
//[a,,b]
//Tokens:
// <a>, <>, <b>,
//[,a]
//Tokens:
// <>, <a>,
//[a,]
//Tokens:
// <a>, <>,
//[,a,,b]
//Tokens:
// <>, <a>, <>, <b>,
//[,,a,,b,,]
//Tokens:
// <>, <>, <a>, <>, <b>, <>, <>,
//[,]
//Tokens:
// <>, <>,
//[,,]
//Tokens:
// <>, <>, <>,
//[,,,]
//Tokens:
// <>, <>, <>, <>,

热点排行