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

这个string字串分拆使用的方法

2013-07-04 
求助这个string字串分拆使用的方法本帖最后由 u011139493 于 2013-06-21 18:49:43 编辑string tempStr

求助这个string字串分拆使用的方法
本帖最后由 u011139493 于 2013-06-21 18:49:43 编辑 string tempStr = "book.,ok.,btw.,w.,king.,ing."

int Nums = //有多少个数据,上面例子tempStr有6个以逗号分隔开的数据

1、想求出string有多少个数据?,它们都是以逗号分开的

2、建立一个string OK_string[Nums],把tempStr里面Nums(应该还要减去1吧?)个数据字串,逐个写入到这个数组?
[解决办法]


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

int get_count(const char* str)
{
    char* p = (char*)str;
    int count = 0;
    
    if(strlen(str) == 0) return 0;
    
    while(*p)
    {
        if(*p == ',') count++;
        p++;
    }
    --p;
    if(*p != ',') count++;
    if(*str == ',') count--;
    
    return count;
}

int main(void)
{
    printf("%d\n", get_count("book.,ok.,btw.,w.,king.,ing."));
    
    return 0;
}

[解决办法]
string和char*之间的转换非常简单的:

#include <string>
#include <cstring>
#include <cstdio>
using namespace std;

int get_count(const char* str)
{
    char* p = (char*)str;
    int count = 0;
    
    if(strlen(str) == 0) return 0;
    
    while(*p)
    {
        if(*p == ',') count++;
        p++;
    }
    --p;
    if(*p != ',') count++;


    if(*str == ',') count--;
    
    return count;
}

int main(void)
{
    string str = "book.,ok.,btw.,w.,king.,ing.";
    printf("%d\n", get_count(str.c_str()));
    
    return 0;
}


[解决办法]
遍历字符串,碰到一个,加1.string类有个成员函数c_str()将c++字符串类转化成c的字符串。
[解决办法]

#include <iostream>
#include <sstream>

using namespace std;

int main()
{
string tempStr = "book.,ok.,btw.,w.,king.,ing.";
char flag = ',';
int n = 0;
int i = 0;
//逐个字符比较
for (; i < tempStr.size(); i++)
{
if (tempStr[i] == flag)
n++;
}
n++; //数据个数比分隔符多1
cout << n << endl;
//建立动态string数组
string* OK_string = new string[n];
//用string流来取得每个数据
istringstream ist(tempStr);
i = 0;
while (getline(ist, OK_string[i], flag))
i++;
//打印结果
for (i = 0; i < n; i++)
cout << OK_string[i] << endl;
return 0;
}

[解决办法]
只是想知道分几段的话,数下,个数+1就好了
count(str.begin(), str.end(), ',')+1;

直接得到string数组的话
vector<string> split(const string& _Str, char delim)
{
    stringstream is(_Str);
    vector<string> arr;
    string str;
    while(getline(is, str, delim))
        arr.push_back(str);
    return cont;
}


[解决办法]
那给你一个完整的C++程序,这个应该很容易看懂的:

 #include <iostream>
 #include <string>
 #include <vector>
 
 std::vector<std::string> split(std::string str, std::string pattern)
 {
     std::string::size_type pos;
     std::vector<std::string> result;
     str += pattern;


     int size = str.size();
 
     for(int i = 0; i < size; i++)
     {
         pos = str.find(pattern, i);
         if(pos < size)
         {
             std::string s = str.substr(i, pos - i);
             result.push_back(s);
             i = pos + pattern.size() - 1;
         }
     }
     return result;
 }
 
 int main(void)
 {
     std::string str = "book.,ok.,btw.,w.,king.,ing.";
     std::string pattern = ",";

     std::vector<std::string> result = split(str, pattern);
     std::cout << "Total " << result.size() << "sub strings:" << std::endl;
     for(int i=0; i<result.size(); i++)
     {
         std::cout << i << ". " << result[i] << std::endl;
     }

     return 0;
 }



引用:
Quote: 引用:

string和char*之间的转换非常简单的:

#include <string>
#include <cstring>
#include <cstdio>
using namespace std;

int get_count(const char* str)
{
    char* p = (char*)str;
    int count = 0;
    
    if(strlen(str) == 0) return 0;
    
    while(*p)
    {
        if(*p == ',') count++;
        p++;
    }
    --p;
    if(*p != ',') count++;
    if(*str == ',') count--;


    
    return count;
}

int main(void)
{
    string str = "book.,ok.,btw.,w.,king.,ing.";
    printf("%d\n", get_count(str.c_str()));
    
    return 0;
}











我还是无法理解,如何可以把数据逐个取出?

[解决办法]
找到了以前写过的代码,也贴上来一个:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>


//将字符串用指定分隔字符分开为字符串数组
//std::string const & source:要拆分的字符串
//char delim:分隔字符
//std::vector<std::string> & target:存放结果的字符串数组
//返回值:拆分产生的字符串数量
//如果拆分成功,target中的原有数据被清空,拆分结果被放入target
//如果拆分成功,target中至少有一个元素
//如果发生异常,target中的数据不变
//为了减少数据拷贝,拆分结果(字符串数组)使用变参传递
//如果字符串source以分隔符开始,则结果数组中第一个元素是空串
//如果字符串source以分隔符结束,则结果数组中最后一个元素是空串
unsigned int split_string( std::string const & source , char delim, std::vector<std::string> & target )
{
    std::string::size_type start = 0;
    //未处理的字符串起始位置。
    std::string::size_type const length = source.length();
    //未处理字符串的长度
    //如果需要改变首字符为分隔符时的逻辑,请修改start和length。
    //如果需要改变尾字符是分隔符时的逻辑,请修改length

    std::string::size_type pos;
    std::vector<std::string> temp;
    //暂存结果数组,以保证发生异常时不影响target
 

    while( (start < length) && ( pos = source.find( delim, start ) ) != std::string::npos )
    //在剩余的字符串中未找到delim时退出循环
    {
        temp.push_back( std::string() );
        temp.back().assign( source, start, pos - start );
        //先加入数组再赋值,目的是减少字符串拷贝动作
        start = pos + 1;//跳过delim
    }
    //处理剩余字符串
    temp.push_back( std::string());
    temp.back().assign( source, start, length - start );
    
    temp.swap( target );


    return target.size();
}


int main (int argc, char** argv) 
{

    std::string str = "book.,ok.,btw.,w.,king.,ing.";
    std::vector<std::string> result;
    split_string( str, ',', result );
    std::copy( result.begin(), result.end(), std::ostream_iterator< std::string >( std::cout, "\n" ) );
    //上面的代码当于:
    //for( int i = 0; i < result.count; ++ i )
    //{
    //    std::cout << result[i] << "\n";
    //}
    std::cin.get();
    return 0;
}



话说这个“分割字符串”的函数以前没少写,在Delphi里,在C++里,返回值有array of string(Delphi)、TStringList(Delphi)、vector<string>(c++)、list<string>(c++),分隔符有字符、字符串、字符集合(在C++中用字符串代替字符集合),c++中还写过spliter_iterator版本的……


[解决办法]
为什么不用vector?

有个、strtok(..., ...);可以用来分割以指定字符分格的字符串
[解决办法]
#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:
// <>, <>, <>, <>,


[解决办法]
用static变量实现strtok很不好,在遇到多线程时会出问题。

C运行库中的strtok用的是线程变量。
[解决办法]

#include <string>
void TestCountSubstring()
{
string src = "book.,ok.,btw.,w.,king.,ing.";
int nums = 0;
std::size_t pospre = 0;
std::size_t posnext = 0;
while ( (posnext=src.find_first_of(',', pospre)) != string::npos )
{
++nums;
pospre = posnext + 1;
}
++nums;
cout<<nums<<endl;
}

[解决办法]
只想知道数量的话不需要那么麻烦:


unsigned int count = std::count( str.begin(), str.end(), ',' ) + 1;

热点排行