C++ Primer 5th 9.47题
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void Number(const string &s);
void Zimu(const string &s);
int main()
{
string s = "ab2c3d7R4E6";
Number(s);
Zimu(s);
system("pause");
return 0;
}
void Number(const string &s)
{
vector<char> a;
string numbers = "0123456789";
for (int i = 0; i != s.size();)
{
i = s.find_first_of(numbers, i);
if (i != -1)
{
a.push_back(s[i]);
i++;
}
else
break;
}
cout << "数字有:" << endl;
for (auto it : a)
cout << it << endl;
}
void Zimu(const string &s)
{
vector<char> a;
string numbers = "0123456789";
for (int i = 0; i != s.size();)
{
i = s.find_first_not_of(numbers, i);
if (i != -1)
{
a.push_back(s[i]);
i++;
}
else
break;
}
cout << "字母有:" << endl;
for (auto it : a)
cout << it << endl;
}
这是第一版程序
原先错误的地方有:
1.vector中的元素类型应为char
2.i没有自增1,所以i一直停留在那个元素
由于太过冗长,修改如下:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void Number(const string &s);
void Zimu(const string &s);
int main()
{
string s = "ab2c3d7R4E6";
Number(s);
Zimu(s);
system("pause");
return 0;
}
void Number(const string &s)
{
vector<char> a;
string numbers = "0123456789";
for (int i = 0; (i = s.find_first_of(numbers, i)) != -1;i++)
{
a.push_back(s[i]);
}
cout << "数字有:" << endl;
for (auto it : a)
cout << it << endl;
}
void Zimu(const string &s)
{
vector<char> a;
string numbers = "0123456789";
for (int i = 0; (i = s.find_first_not_of(numbers, i)) != -1; i++)
{
a.push_back(s[i]);
}
cout << "字母有:" << endl;
for (auto it : a)
cout << it << endl;
}
不需要考虑s的越界问题,因为在你越界之前,find_first_of函数已经检验完毕,直接退出循环,所以把s.size()判断条件改为直到找不到了为止
还有=比!=的优先级低,所有应该打括号