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

思路: 遍历字符串, 根据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;
参考技术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 <iostream>
#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编写一段代码,要求用户从键盘输入一字符串,程序负责提取出其中的数字字符,并显示。 大神求教

C++提取字符串里面的数字

怎么用js提取字符串中的某一段字符

c++ 怎样提取一个字符串中的连续数字并放到另一个数组中保存? 急!

EXCEL用VBA提取字符串

求一段C小程序关于度分秒.转换