- 在单个字符的查找上,find 和 find_\first_of()是等价的
1. basename 和扩展名(extension)的获得
注意,一个字符串形式的文件名(filename),自然包含 basename 和扩展名(extension),需要注意的是,扩展名是最后一个.
(句点)后的子串,而非第一个,最后一个
自然对应于字符串类的find_last_of
。
std::string filename = "hello.txt.doc", basename, extname;
std::string::size_type idx = filename.find_last_of(".");
if (idx != std::string::npos)
{
basename = filename.substr(0, idx);
extname = filename.substr(idx+1, filename.size()-idx-1);
}
2. 文件名合法性的判断
文件名以句点.
结尾是不允许的;
推论——文件名非法的判断:
没有句点
句点在文件名的结尾处
std::string::size_type idx = filename.find_last_of('.');
if (idx != std::string::npos && idx != filename.size()-1)
...
3. substr:获得子串
注意该接口的两个参数不表,起始位置和结束,而是开始下标和子串的长度;
str.substr(s); // 表示开始到末尾 str[s:],等价于
str.substr(s, n-s);
// str.substr(1) ⇒ 删除第一个字母后的其他字符串
str.substr(s, t-s+1);
// 表示 str[s:t] 之间的,包含两端点
substr 和 find_** 等成员函数结合,实现颇为强大的功能:
string str = "doqurfhw1780292fhie", nums = "1234567890";
int s = str.find_first_of(nums);
int t = str.find_last_of(nums);
cout << str.substr(s, t-s+1) << endl;
// 1780292
4. +:字符串拼接
str1 + str2;