求一段提取字符串中的字符与数字的代码,用C++编写
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求一段提取字符串中的字符与数字的代码,用C++编写相关的知识,希望对你有一定的参考价值。
问题1:
例如 string strFields = "^小明语文考了100分,妈妈给他了10.5元钱作为奖励,小明花了5.4元买了一个冰激凌,又花了4.1元买了一本漫画书,剩下的1元存进了储蓄罐!";
现有两个链表LIST,LIST1,LIST2,我想把strFields中的字符与数字分别存进LIST2保存起来,比如LIST1中存放“"^小明语文考了”,“分,妈妈给他了”,“元钱作为奖励,小明花了”,“元买了一个冰激凌,又花了”,“元买了一本漫画书,剩下的”,“元存进了储蓄罐!”等字符串;LIST2中存放,100, 10.5, 5.4, 4.1, 1等数字。
如何用C++实现。
问题2:
例如有两个长字符串:
string strFields1 = "^小明语文考了100分,妈妈给他了10元钱作为奖励,小明花了5元买了一个冰激凌,又花了4元买了一本漫画书,剩下的1元存进了储蓄罐!";
string strFields2 = "^小明语文考了120分,妈妈给他了20元钱作为奖励,小明花了10元买了一个冰激凌,又花了5元买了一本漫画书,剩下的5元存进了储蓄罐!";
从两个字符串上看,除了数字不同,什么都一样,我想把这两个字符串合为一个,变成
string strFields3 = "^小明语文考了220分,妈妈给他了30元钱作为奖励,小明花了15元买了一个冰激凌,又花了9元买了一本漫画书,剩下的6元存进了储蓄罐!";
该如何实现比较方便,用C++实现。
我的问题1是为了实现问题2,想把问题2的两个字符串分别解析后,把数字依次相加,再重新拼接。
所以如果有好办法直接能实现问题2,特此求教。
代码: vs2012测试通过, 其他版本应该也没问题
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int findFirstNum(int*, int);
int convertToInt(string);
void getRealNum(int*, int*, string, int*);
string convertToString(int);
int main()
string strFields1 = "^小明语文考了100分,妈妈给他了10元钱作为奖励,小明花了5元买了一个冰激凌,又花了4元买了一本漫画书,剩下的1元存进了储蓄罐!";
string strFields2 = "^小明语文考了120分,妈妈给他了20元钱作为奖励,小明花了10元买了一个冰激凌,又花了5元买了一本漫画书,剩下的5元存进了储蓄罐!";
//string strFields1 = "我有1000个银币, 投入了20个箱子, 56个猴子出来了";
//string strFields2 = "我有2000个银币, 投入了40个箱子, 16个猴子出来了";
int pointnum1[100];
int pointnum2[100];
int realnum1[100];
int realnum2[100];
int realnum3[100];
int firstnum1[100];
int firstnum2[100];
string num[100];
memset(pointnum1,0,100*sizeof(int));
memset(pointnum2,0,100*sizeof(int));
memset(realnum1,0,100*sizeof(int));
memset(realnum2,0,100*sizeof(int));
memset(realnum3,0,100*sizeof(int));
memset(firstnum1,0,100*sizeof(int));
memset(firstnum2,0,100*sizeof(int));
getRealNum(realnum1,pointnum1,strFields1,firstnum1);
getRealNum(realnum2,pointnum2,strFields2,firstnum2);
cout << "字符串1: "<< strFields1 << endl;
cout << "字符串2: "<< strFields2 << endl << endl;
int i;
for(i=0;i<100;i++)
if(realnum1[i] == 0) break;
realnum3[i] = realnum1[i] + realnum2[i];
num[i] = convertToString(realnum3[i]);
strFields2.replace(firstnum2[i], num[i].length(), num[i]);
cout << "数字1: " << realnum1[i] << endl;
cout << "数字2: " << realnum2[i] << endl;
cout << "数字和: " << realnum3[i] << endl << endl;
cout << "最后输出结果: "<< strFields2 << endl;
system("pause");
int findFirstNum(int* p, int s)
while(p[s-1] - p[s-2] == 1)
s -= 1;
return p[s-1];
int convertToInt(string s)
int num;
stringstream ss;
ss << s;
ss >> num;
return num;
void getRealNum(int* realnum1, int* pointnum, string s, int* firstnum)
int p_size = 0;
int r_size = 0;
bool isnum = false;
for(int i=0;i<(int)s.length();i++)
if(s.at(i) >= 0x30 && s.at(i) <= 0x39)
pointnum[p_size] = i;
p_size++;
isnum = true;
continue;
if(isnum)
isnum = false;
firstnum[r_size] = findFirstNum(pointnum, p_size);
string number = s.substr(firstnum[r_size], 5);
realnum1[r_size] = convertToInt(number);
r_size++;
string convertToString(int num)
string s;
ostringstream oss;
oss << num;
s = oss.str();
return s;
参考技术A 问题1:
string strFields = "^小明语文考了100分,妈妈给他了10.5元钱作为奖励,小明花了5.4元买了一个冰激凌,又花了4.1元买了一本漫画书,剩下的1元存进了储蓄罐!";
stringstream ss(strFields);
string tmp;
vector<string> strs;
vector<double> nums;
double num;
char c;
for(;;)
if ( ss >> num )
if (!tmp.empty())
strs.push_back(tmp);
tmp.clear();
nums.push_back(num);
else
ss.clear();
ss >> c;
if (ss.eof()) break;
tmp.push_back(c);
strs.push_back(tmp);
问题2:
顺序万一不一样怎么办……顺序一样还好办,不一样的话真没那么容易。我现在没有啥好的思路解决问题2本回答被提问者和网友采纳
C++提取字符串里面的数字
现有一串字符串,如下:“chr4,+77311909,25M,1;chr2,+63439874,25M,1;chr10,-58952431,25M,1;chrX,-120369984,25M,1;chr13,-58752466,25M,1;chrX,-126676818,25M,1;”
现在要做的是提取字符串中所有的+号和-号后面的数字,比如提取+号后面的77311909,-号后面的58952431,怎么样编写算法提取,谢谢。
#include <string>
using namespace std;
int main()
string s = "chr4,+77311909,25M,1;chr2,+63439874,25M,1;chr10,-58952431,25M,1;chrX,-120369984,25M,1;chr13,-58752466,25M,1;chrX,-126676818,25M,1;";
int value = 0;
int i = 0;
int sign = 0;
while(i<s.length())
while(i<s.length() && s[i]!='+' && s[i]!='-')//先找到开头的+或-
i++;
if(i>=s.length())
break;
if(s[i]=='+')//确定正负号
sign = 1;
if(s[i]=='-')//确定正负号
sign = -1;
i++;
value = 0;
while(i<s.length() && s[i]!=',')//开始累加,遇到逗号停止累加
value = value * 10 + s[i] - '0';
i++;
cout << value*sign << endl;
return 0;
参考技术A # include <iostream>
# include <string>
const int LEN = 99;
void pick(std::string str);
int main (void)
using namespace std;
string str = "chr4,+77311909,25M,1;chr2,+63439874,25M,1;chr10,-58952431,25M,1;chrX,-120369984,25M,1;chr13,-58752466,25M,1;chrX,-126676818,25M,1;";
pick(str);
return 0;
void pick(std::string str)
char pick[6][LEN];
int num, goal;
num = goal = 0;
while(str[goal])
if('+' == str[goal] || '-' == str[goal])
int i = 0;
goal++;
while(',' != str[goal])
pick[num][i] = str[goal];
i++;
goal++;
pick[num][i] = '\\0';
num++;
goal++;
for(int i = 0; i < 6; ++i)
std::cout << pick[i] << std::endl;
这样应该可以
可能不够具有通用性,如果在不知道字符串有多少个+号或者-号的时候,你这个算法就可能不适用了。不过很感谢。
参考技术B 纯c加上string.h的库函数的话,如果格式都是这样的,建议用strtoken把这个字符串用分号打开。
然后再用strtoken打散逗号,然后放在数据结构里。
就可以完成提取了。追问
这个方法挺麻烦,有没有更好的方法?
追答或可以考虑c++中正则表达式做这个事情,也可以,但是要涉及学习正则表达式的成本。
追问谢谢
参考技术C 提取出来还是放在字符串里么string a,ans;
cin>>a;
for (int q=0;q<a.length();q++)
if (a[q]>='0'&&a[q]<='9')
ans+=a[q];
cout<<a[q];
以上是关于求一段提取字符串中的字符与数字的代码,用C++编写的主要内容,如果未能解决你的问题,请参考以下文章
python编写一段代码,要求用户从键盘输入一字符串,程序负责提取出其中的数字字符,并显示。 大神求教