C++中1个string字符串,怎么根据空格拆成几个字符串?

xinyao45 2012-12-26 10:15:49
假如 string str1={"qwe bbb 333"};
怎么得到 string str2={"qwe"},string str3={"bbb"},string str4={"333"}.
...全文
21035 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_18613285 2014-08-03
  • 打赏
  • 举报
回复
void change() { string a,b,c; cout<<"input three words\n"<<endl; cin>>a>>b>>c; cout<<c<<" "<<b<<" "<<a<<endl; }
stereoMatching 2012-12-29
  • 打赏
  • 举报
回复
向各位学习,顺便献上一份很简单的实做品 如果你们允许使用boost的话

#include <string>
#include <vector>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>

using namespace std;

void split_string()
{
    string const s = "qwe  bbb  333";
    vector<string> rs;
    boost::split( rs, s, boost::is_any_of( " " ), boost::token_compress_on );
    for(auto const &data : rs){ //range based for loop, c++11才有
        cout << data << endl;
    }
    cout << rs.size() << endl;
}
谢谢版主的代码,收益良多,但我觉得回传值的部分应该可以更好一点

vector<string> split(const string &str, const string &sep) 
{
  vector<string> svec;

  //......
  return svec;
}
c++11中不会产生任何多余的copy,如果编译器有支援rvalue reference的话 一点意见,有错请鞭
hanyue03 2012-12-29
  • 打赏
  • 举报
回复
围观楼主,同时向各位大神学习
竞天问 2012-12-29
  • 打赏
  • 举报
回复
C++11支持正则表达式了
andyboliu 2012-12-29
  • 打赏
  • 举报
回复
前段时间刚写过这个代码,每个空格之间的字符赋值给一个Edit控件,以"#"键结束,你参照这改一下吧~ int len; len=m_str.GetLength(); char ch; CString str_num; if (len) { for (int i=0;i<len;i++) { ch=m_str.GetAt(i); if (ch==' ')//遇到空格则将以前到#的所有内容输出 { switch(k) { case 0:m_edit1=str_num;break; case 1:m_edit2=str_num;break; default: MessageBox(_T("现在仅支持两个参数输入!")); k=0; m_str.Empty(); EditInitialize();//控件显示初始化 dap_mark=TRUE; } if (dap_mark) { break; } k++; UpdateData(FALSE); str_num.Empty(); //break; } else if (ch=='#')//#作为结束符号 { str_num+=ch; str_num.Empty(); k=0; m_str.Empty(); } else { str_num+=ch; continue; } } } k=0;//空格计数重新置零,针对分多次输入的累加情况
zhcosin 2012-12-28
  • 打赏
  • 举报
回复
万能的 sscanf 函数居然都让你给忽略了:

char *source = "aaa bbb ccc";
char a1[10], a2[10], a3[10];
sscanf(source, "%[^ ] %[^ ] %s", a1, a2, a3);
mymtom 2012-12-28
  • 打赏
  • 举报
回复

/**
 * @file    split.cpp
 * @brief   
 */

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

vector<string> *split(const string &str, const string &sep) 
{
    vector<string> *svec = new vector<string>;
    string::size_type beg = 0, end = 0;

    beg = str.find_first_not_of(sep, end);
    while (beg != string::npos) {
        end = str.find_first_of(sep, beg);
        if (end == string::npos) {
            svec->push_back(string(str, beg));
            break;
        } else {
            svec->push_back(string(str, beg, end - beg));
            beg = str.find_first_not_of(sep, end);
        }
    }

    return svec;
}

int main(int argc, char *argv[])
{
    string s("qwe  bbb  333");

    vector<string> *svec;
    vector<string>::const_iterator iter;

    svec = split(s, " ");
    for (iter = svec->begin(); iter != svec->end(); ++iter)
        cout << *iter << endl;

    delete svec;

    return 0;
}
zhcosin 2012-12-28
  • 打赏
  • 举报
回复
引用 18 楼 zhao4zhong1 的回复:
引用 17 楼 zhcosin 的回复:万能的 sscanf 函数居然都让你给忽略了: C/C++ code?123char *source = "aaa bbb ccc";char a1[10], a2[10], a3[10];sscanf(source, "%[^ ] %[^ ] %s", a1, a2, a3); 请判断万能的sscanf函数的返回值。 ……
我只是提醒他有这个函数,没给他完整的代码。
赵4老师 2012-12-28
  • 打赏
  • 举报
回复
引用 17 楼 zhcosin 的回复:
万能的 sscanf 函数居然都让你给忽略了: C/C++ code?123char *source = "aaa bbb ccc";char a1[10], a2[10], a3[10];sscanf(source, "%[^ ] %[^ ] %s", a1, a2, a3);
请判断万能的sscanf函数的返回值。
赵4老师 2012-12-27
  • 打赏
  • 举报
回复
这是我自己实现的一个扩展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:
// <>, <>, <>, <>,
ljhhh0123 2012-12-27
  • 打赏
  • 举报
回复
最笨的办法是用标准库的stringstream,顶楼上的.
正在无聊中 2012-12-26
  • 打赏
  • 举报
回复
SORRY,去掉ss.close()
正在无聊中 2012-12-26
  • 打赏
  • 举报
回复 1

#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main()
{
string str="abc def ghi",word;
stringstream ss(str);
while(ss >> word)cout << word << endl;
ss.close();
return 0;
}
shiqingkun 2012-12-26
  • 打赏
  • 举报
回复
他们写的都很好。。不过我用的是笨办法。。。 string str1="qwe bbb 333"; int index = str1.find(" "); string str2 = str1.substr(0,index); string str4= str1.substr(index); index = str4.rfind(" "); string str3 = str4.substr(index); str4 = str4.substr(0,index); 还有点小瑕疵。。。
viktor 2012-12-26
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
C可以用strtok函数
strtok out了,现在纯C都改用strsep了 转这个文章 http://blog.csdn.net/baggiochen10/article/details/5900934
jackzhhuang 2012-12-26
  • 打赏
  • 举报
回复

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

int main()
{
	string str1="  qwe  bbb  333  ";

	int iBegin = 0;
	string::size_type iLatter = 0;
	string::size_type iFormer = string::npos;

	while (1)
	{
		iLatter = str1.find_first_not_of(' ', iLatter);
		if (string::npos == iLatter)
		{
			break;
		}

		iFormer = str1.find_first_of(' ', iLatter + 1);
		if (string::npos == iFormer)
		{
			iFormer = str1.length();
		}

		// str2, str3, str4
		string strNew(str1, iLatter, iFormer - iLatter);

		cout << strNew << endl;

		iLatter = iFormer + 1;
	}

	getchar();
}

abc41106 2012-12-26
  • 打赏
  • 举报
回复
可以用string的find和substr 或者字符串流处理:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
void main()
{
string str1 = "qwe  bbb  333";
string str2,str3,str4;
istringstream is(str1);
is>>str2>>str3>>str4;
cout<<str2<<","<<str3<<","<<str4<<endl;
}
sanae 2012-12-26
  • 打赏
  • 举报
回复
1. boost::algorithm::split http://www.boost.org/doc/libs/1_52_0/doc/html/string_algo/usage.html 2. std::stringstream + std::getline stringstream ss(str); while(getline(ss, str, ' ')){ ... }
zilaishuichina 2012-12-26
  • 打赏
  • 举报
回复
JAVA 有现成API C++貌似的自己实现
suifeng3702 2012-12-26
  • 打赏
  • 举报
回复
个人还是比较喜欢2楼的风格,简单明了
加载更多回复(4)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧