题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1073
string
既然用到了string,我们就回顾一下常用的string接口,每一个接口都有几种重载,只需会用常用的即可。
size()/begin()/end()就不提了。
首先给出一个网址(http://www.com/reference/string/string/),自己经常参考一些C++信息。
1. find()
size_t find (const string& str, size_t pos = 0) const noexcept;
size_t find (const char* s, size_t pos = 0) const;
size_t find (const char* s, size_t pos, size_type n) const;
size_t find (char c, size_t pos = 0) const noexcept;
find返回下标。
各参数:
str: 查找str第一次出现的位置。
s: 查找C语言字符串s第一次出现的位置。
c: 查找字符c第一次出现的位置。
pos: 从pos处开始查找,包括pos。
n: 需要匹配的位数。
因此,我们常用的是:
size_t find (const string& str, size_t pos = 0) const noexcept;
size_t find (const char* s, size_t pos = 0) const;
size_t find (char c, size_t pos = 0) const noexcept;
2. erase()
接口声明见:http://www.cplusplus.com/reference/string/string/erase/。
sequence (1) | string& erase (size_t pos = 0, size_t len = npos); |
---|---|
character (2) | iterator erase (const_iterator p); |
range (3) | iterator erase (const_iterator first, const_iterator last); |
(1) 按下标删除:区间为[pos, pos+npos); npos为需要删除的数量,pos为开始位置。
(2) 按迭代器删除一个字符:给出迭代器p。
(3) 按迭代器删除一个区间:给出2个迭代器first和last。
其实,如果删除一个字符k,直接使用
str.erase('k');
3. insert()
重载比较多
string (1) | string& insert (size_t pos, const string& str); |
---|---|
substring (2) | string& insert (size_t pos, const string& str, size_t subpos, size_t sublen); |
c-string (3) | string& insert (size_t pos, const char* s); |
buffer (4) | string& insert (size_t pos, const char* s, size_t n); |
fill (5) | string& insert (size_t pos, size_t n, char c); iterator insert (const_iterator p, size_t n, char c); |
single character (6) | iterator insert (const_iterator p, char c); |
range (7) | template <class InputIterator> iterator insert (iterator p, InputIterator first, InputIterator last); |
initializer list (8) | string& insert (const_iterator p, initializer_list<char> il); |
(1) 在pos处开始插入str。
(3) 在pos处开始插入C语言字符串s。
(4) 在pos处开始插入C语言字符串s的前n位。
(5) 在pos处开始插入n个字符c。两种形式,如果使用0作为下标,他不知道你这个是下标还是迭代器的!
如果在开始插入字符,不应使用:s1.insert(0, n, '0'); 在结尾处插入使用s1.insert(s1.end(), n, '0'); 其他位置的插入,可以使用下标。 比如:s1.insert(1, n, '0');
4. replace()
string (1) | string& replace (size_t pos, size_t len, const string& str); string& replace (const_iterator i1, const_iterator i2, const string& str); |
---|---|
substring (2) | string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen); |
c-string (3) | string& replace (size_t pos, size_t len, const char* s); string& replace (const_iterator i1, const_iterator i2, const char* s); |
buffer (4) | string& replace (size_t pos, size_t len, const char* s, size_t n); string& replace (const_iterator i1, const_iterator i2, const char* s, size_t n); |
fill (5) | string& replace (size_t pos, size_t len, size_t n, char c); string& replace (const_iterator i1, const_iterator i2, size_t n, char c); |
range (6) | template <class InputIterator> string& replace (const_iterator i1, const_iterator i2, InputIterator first, InputIterator last); |
initializer list (7) | string& replace (const_iterator i1, const_iterator i2, initializer_list<char> il); |
5. substr()
string substr (size_t pos = 0, size_t len = npos) const;看起来很简单,确实挺简单:开始位置pos,长度npos。
6.总结
如果用下标,参数pos为开始位置,如果是一个范围npos是长度。如果是迭代器,老老实实范围两端的迭代器。
本题代码
// 这道题目用C的话,做起来比较繁琐。用stl会省事很多
// 使用了find()/erase()/insert()/size()/begin()/end()
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("E:\\in.txt", "r", stdin);
#endif
char buf[10000+10];
gets(buf);
string line = buf;
// cout << "line:" << line << endl;
if(line[0] == '-')
{
cout << '-';
}
string s1 = line.substr(1, line.find('E', 1)-1);
// cout << "s1:" << s1 << endl;
string s2 = line.substr(line.find('E', 1)+1, line.size());
// cout << "s2:" << s2 << endl;
int index = atoi(s2.c_str());
// cout << "index:" << index << endl;
s1.erase(s1.find('.'), 1);
// cout << "s1:" << s1 << endl;
if(index <0)
{
index = -index;
s1.insert(s1.begin(), index, '0');// 在开始处插入index个'0'
/*---------------------------------------------------------
如果在开始插入字符,不应使用:s1.insert(0, index, '0');
在结尾处插入使用s1.insert(s1.end(), index, '0');
其他位置的插入,可以使用下标。
比如:s1.insert(1, index, '0');
---------------------------------------------------------*/
s1.insert(1, 1, '.');
// cout << "s1:" << s1 << endl;
cout << s1 << endl;
}
else
{
if(s1.size()-1 > index)
{
s1.insert(index+1, 1, '.');
}
else if(s1.size() == index)
{
//nothing
}
else
{
s1.insert(s1.end(), index+1 - s1.size(), '0');
}
cout << s1 << endl;
}
return 0;
}