求助这个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;
}
#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 <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;
}
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;
}
#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;
}
#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;
}
#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:
// <>, <>, <>, <>,
#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;