关于字符串的问题

zxx178239 2013-11-13 11:33:37
直接说题目:
有一个字符串是这样的"123 abc 89 ..."
现在我想从该字符串中提取中123 abc这两个内容,并且存储在一个string类型的数组中
str[0] = "123";
str[1] = "abc";

这样的形式,保存完abc这个子字符串后结束搜索

该如何查找并且在保存完abc后停止搜索,不知该如何操作,大神进来指导一下,可以的话写个小代码学习下,谢了!

不懂得地方可以再问,谢了
...全文
278 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxx178239 2013-11-13
  • 打赏
  • 举报
回复
引用 12 楼 mujiok2003 的回复:
[quote=引用 8 楼 u012183952 的回复:] [quote=引用 6 楼 mujiok2003 的回复:] std::istringstream
#include <string>
#include <sstream>
#include <vector>

int main(int argc, char* argv[])
{
	std::istringstream iss("123   abc 89  ...");
	std::vector<std::string> tokens; 
	std::string s;
        while(iss >> s)
        {
            tokens.push_back(s);
            if(s == "abc") break;
        }
        //whatever
        
	return 0;
}
我貌似没表述清楚,上述字符串只是举例子,不知道第二个子字符串是什么- -[/quote] 简单修改一下就好了。
#include <sstream>
#include <vector>

int main(int argc, char* argv[])
{
	std::istringstream iss("123   abc 89  ...");
	std::vector<std::string> tokens; 
	std::string s;
        while(iss >> s)
        {
            tokens.push_back(s);
            if(tokens.size() == 2) break;
        }
        //whatever
        
	return 0;
}
[/quote] 谢谢解答,受教了
zxx178239 2013-11-13
  • 打赏
  • 举报
回复
引用 14 楼 Adol1111 的回复:
简单修改下:
#include <iostream>
#include <string>
#include<sstream>
#include <vector>

int main(int argc, char* argv[])
{
	std::string text = "123   abc 89  ...";
	std::vector<std::string> vec;
	std::istringstream stream(text);
	std::string str;
	while(stream>>str){
		vec.push_back(str);
		//if(vec.size()==2)break; //根据数量来停止
		//if(vec.back()=="abc")break; //根据插入的字符串是否为指定内容来停止
	}
	for(auto v:vec){
		std::cout<<v<<std::endl;
	}
	return 0;
}
谢谢解答,受教了
zxx178239 2013-11-13
  • 打赏
  • 举报
回复
引用 11 楼 maoshuoqiong 的回复:
不好意思,没弄格式,重新发一下
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <vector>
#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{	
	vector<string> veStr;
	veStr.clear();

	cout<<"请输入需要被拆分的字符串,以空格为间隔:"<<endl;

	char szBuffer[256] = {0x00};
	gets(szBuffer); //获取输入的字符串

	string strSource = szBuffer;
	cout<<strSource<<endl;

	unsigned long nBegin = 0, nPos = 0;
	string strSubStr;
	while((nPos = strSource.find(" ", nBegin)) != string::npos) //查找" "
	{
		strSubStr = strSource.substr(nBegin, nPos-nBegin);
		veStr.push_back(strSubStr);
		nBegin = nPos + 1;
		if (nBegin > strSource.size())
			break;
	}
	if (nBegin <= strSource.size()){
		strSubStr = strSource.substr(nBegin);
		veStr.push_back(strSubStr);
	}

	int nSize = veStr.size();
	for (int n = 0;n<nSize;n++) //打印
	{
		cout<<veStr[n]<<endl;
	}
	system("pause");

	return 0;

}
谢谢解答,看了一下,有两处不满足我的要求: 1.空格随机个数,你这个貌似空格多余一个就不正确了 2.取出字符串中第二个以空格隔开的子字符串之后就不要后边的了。 不过还是谢谢解答了
Adol1111 2013-11-13
  • 打赏
  • 举报
回复
简单修改下:
#include <iostream>
#include <string>
#include<sstream>
#include <vector>

int main(int argc, char* argv[])
{
	std::string text = "123   abc 89  ...";
	std::vector<std::string> vec;
	std::istringstream stream(text);
	std::string str;
	while(stream>>str){
		vec.push_back(str);
		//if(vec.size()==2)break; //根据数量来停止
		//if(vec.back()=="abc")break; //根据插入的字符串是否为指定内容来停止
	}
	for(auto v:vec){
		std::cout<<v<<std::endl;
	}
	return 0;
}
Adol1111 2013-11-13
  • 打赏
  • 举报
回复
只取前两个?还是取指定数目?或者是取指定字符串?
#include <iostream>
#include <string>
#include<sstream>

int main(int argc, char* argv[])
{
	std::string text = "123   abc 89  ...";
	std::string str[2];//换成vector之类的容器,可实现任意数量
	std::istringstream stream(text);
	for(int i=0;i<2;i++){//把2改成n指定数量
		stream>>str[i];
		/*if(str[i]=="abc")//"abc"换指定字符串
			break;*/
	}
	for(int i=0;i<2;i++)
		std::cout<<str[i]<<std::endl;
	getchar();
	return 0;
}
mujiok2003 2013-11-13
  • 打赏
  • 举报
回复
引用 8 楼 u012183952 的回复:
[quote=引用 6 楼 mujiok2003 的回复:] std::istringstream
#include <string>
#include <sstream>
#include <vector>

int main(int argc, char* argv[])
{
	std::istringstream iss("123   abc 89  ...");
	std::vector<std::string> tokens; 
	std::string s;
        while(iss >> s)
        {
            tokens.push_back(s);
            if(s == "abc") break;
        }
        //whatever
        
	return 0;
}
我貌似没表述清楚,上述字符串只是举例子,不知道第二个子字符串是什么- -[/quote] 简单修改一下就好了。
#include <sstream>
#include <vector>

int main(int argc, char* argv[])
{
	std::istringstream iss("123   abc 89  ...");
	std::vector<std::string> tokens; 
	std::string s;
        while(iss >> s)
        {
            tokens.push_back(s);
            if(tokens.size() == 2) break;
        }
        //whatever
        
	return 0;
}
纯洁的老黄瓜 2013-11-13
  • 打赏
  • 举报
回复
不好意思,没弄格式,重新发一下
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <vector>
#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{	
	vector<string> veStr;
	veStr.clear();

	cout<<"请输入需要被拆分的字符串,以空格为间隔:"<<endl;

	char szBuffer[256] = {0x00};
	gets(szBuffer); //获取输入的字符串

	string strSource = szBuffer;
	cout<<strSource<<endl;

	unsigned long nBegin = 0, nPos = 0;
	string strSubStr;
	while((nPos = strSource.find(" ", nBegin)) != string::npos) //查找" "
	{
		strSubStr = strSource.substr(nBegin, nPos-nBegin);
		veStr.push_back(strSubStr);
		nBegin = nPos + 1;
		if (nBegin > strSource.size())
			break;
	}
	if (nBegin <= strSource.size()){
		strSubStr = strSource.substr(nBegin);
		veStr.push_back(strSubStr);
	}

	int nSize = veStr.size();
	for (int n = 0;n<nSize;n++) //打印
	{
		cout<<veStr[n]<<endl;
	}
	system("pause");

	return 0;

}
纯洁的老黄瓜 2013-11-13
  • 打赏
  • 举报
回复
#include <stdlib.h> #include <stdio.h> #include <string> #include <vector> #include <iostream> using namespace std; int main(int argc,char* argv[]) { vector<string> veStr; veStr.clear(); cout<<"请输入需要被拆分的字符串,以空格为间隔:"<<endl; char szBuffer[256] = {0x00}; gets(szBuffer); //获取输入的字符串 string strSource = szBuffer; cout<<strSource<<endl; unsigned long nBegin = 0, nPos = 0; string strSubStr; while((nPos = strSource.find(" ", nBegin)) != string::npos) //查找" " { strSubStr = strSource.substr(nBegin, nPos-nBegin); veStr.push_back(strSubStr); nBegin = nPos + 1; if (nBegin > strSource.size()) break; } if (nBegin <= strSource.size()){ strSubStr = strSource.substr(nBegin); veStr.push_back(strSubStr); } int nSize = veStr.size(); for (int n = 0;n<nSize;n++) //打印 { cout<<veStr[n]<<endl; } system("pause"); return 0; }
zxx178239 2013-11-13
  • 打赏
  • 举报
回复
引用 4 楼 U_Fan 的回复:
#include <iostream>
#include <string>
#include <boost/tokenizer.hpp>

typedef boost::tokenizer<boost::char_separator<char>> tokenizer;

int main()
{
	std::string strTemp= "123 ab 89  def 504";
	boost::char_separator<char> ep(" ");
	tokenizer tok(strTemp,ep);
	for (tokenizer::const_iterator it = tok.begin(); it != tok.end(); ++it)
	{
		std::cout<<*it<<std::endl;
	}
	return 0;
}
这样貌似不是到第二个子字符串结束吧
zxx178239 2013-11-13
  • 打赏
  • 举报
回复
引用 6 楼 mujiok2003 的回复:
std::istringstream
#include <string>
#include <sstream>
#include <vector>

int main(int argc, char* argv[])
{
	std::istringstream iss("123   abc 89  ...");
	std::vector<std::string> tokens; 
	std::string s;
        while(iss >> s)
        {
            tokens.push_back(s);
            if(s == "abc") break;
        }
        //whatever
        
	return 0;
}
我貌似没表述清楚,上述字符串只是举例子,不知道第二个子字符串是什么- -
zxx178239 2013-11-13
  • 打赏
  • 举报
回复
引用 1 楼 turingo 的回复:

#include <stdio.h>

int main(int argc, char* argv[])
{
	char text[] = "123   abc 89  ...";
	char str[2][10];

	sscanf(text, "%s%s", str[0], str[1]);
	printf("(%s, %s)\n", str[0], str[1]);

	return 0;
}
[quote=引用 楼主 u012183952 的回复:] 直接说题目: 有一个字符串是这样的"123 abc 89 ..." 现在我想从该字符串中提取中123 abc这两个内容,并且存储在一个string类型的数组中 str[0] = "123"; str[1] = "abc"; 这样的形式,保存完abc这个子字符串后结束搜索 该如何查找并且在保存完abc后停止搜索,不知该如何操作,大神进来指导一下,可以的话写个小代码学习下,谢了! 不懂得地方可以再问,谢了
[/quote] 受教了,谢谢
mujiok2003 2013-11-13
  • 打赏
  • 举报
回复
std::istringstream
#include <string>
#include <sstream>
#include <vector>

int main(int argc, char* argv[])
{
	std::istringstream iss("123   abc 89  ...");
	std::vector<std::string> tokens; 
	std::string s;
        while(iss >> s)
        {
            tokens.push_back(s);
            if(s == "abc") break;
        }
        //whatever
        
	return 0;
}
纯洁的老黄瓜 2013-11-13
  • 打赏
  • 举报
回复
引用 3 楼 u012183952 的回复:
[quote=引用 2 楼 maoshuoqiong 的回复:] 问题不是很明白,“该如何查找并且在保存完abc后停止搜索” 这个用if判断一下是否已经取得了"abc"不就行了么?
大神,- - abc只是一个例子,不知道它是什么[/quote] 就是给一个未知字符串,不知道长度,以空格为间隔,也不知道到底能分出多少个子字符串?
bbos44 2013-11-13
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
#include <boost/tokenizer.hpp>

typedef boost::tokenizer<boost::char_separator<char>> tokenizer;

int main()
{
	std::string strTemp= "123 ab 89  def 504";
	boost::char_separator<char> ep(" ");
	tokenizer tok(strTemp,ep);
	for (tokenizer::const_iterator it = tok.begin(); it != tok.end(); ++it)
	{
		std::cout<<*it<<std::endl;
	}
	return 0;
}
zxx178239 2013-11-13
  • 打赏
  • 举报
回复
引用 2 楼 maoshuoqiong 的回复:
问题不是很明白,“该如何查找并且在保存完abc后停止搜索” 这个用if判断一下是否已经取得了"abc"不就行了么?
大神,- - abc只是一个例子,不知道它是什么
纯洁的老黄瓜 2013-11-13
  • 打赏
  • 举报
回复
问题不是很明白,“该如何查找并且在保存完abc后停止搜索” 这个用if判断一下是否已经取得了"abc"不就行了么?
图灵狗 2013-11-13
  • 打赏
  • 举报
回复

#include <stdio.h>

int main(int argc, char* argv[])
{
	char text[] = "123   abc 89  ...";
	char str[2][10];

	sscanf(text, "%s%s", str[0], str[1]);
	printf("(%s, %s)\n", str[0], str[1]);

	return 0;
}
引用 楼主 u012183952 的回复:
直接说题目: 有一个字符串是这样的"123 abc 89 ..." 现在我想从该字符串中提取中123 abc这两个内容,并且存储在一个string类型的数组中 str[0] = "123"; str[1] = "abc"; 这样的形式,保存完abc这个子字符串后结束搜索 该如何查找并且在保存完abc后停止搜索,不知该如何操作,大神进来指导一下,可以的话写个小代码学习下,谢了! 不懂得地方可以再问,谢了
zxx178239 2013-11-13
  • 打赏
  • 举报
回复
引用 21 楼 zhao4zhong1 的回复:
那就来个更强大的:
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.
突然发现还有%n这种东西,赵sir威武
zxx178239 2013-11-13
  • 打赏
  • 举报
回复
引用 19 楼 zhao4zhong1 的回复:
小心驶得万年船:
#include <stdio.h>

int main(int argc, char* argv[])
{
    char text[] = " 123   abc 89  ...";
    char str[2][10];

    if (2==sscanf(text, "%9s%9s", str[0], str[1]))
        printf("(%s, %s)\n", str[0], str[1]);
 
    return 0;
}
严谨!!
赵4老师 2013-11-13
  • 打赏
  • 举报
回复
那就来个更强大的:
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.
加载更多回复(3)

64,637

社区成员

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

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