求一段提取字符串中的字符与数字的代码,用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,特此求教。

思路: 遍历字符串, 根据ASCII码 0x30 - 0x39为数字的特点找出数字, 将字符串中的数字转换为Int存储下来, 相加, 再将Int数字转换为字符串, 填入源字符串对应位置.

代码: 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;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-16
问题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本回答被提问者和网友采纳
相似回答