据说“回”字有4种写法,而在C++中将一个char转成一个string却至少有10种方法。
Perl的失败,一个原因是语法像天书,另一个原因是同一个功能的语法实现方式太多,导致代码易读性变差。
虽然C++中有10种方法,但常用的也许就那么2、3种;其他的方法只要知道个大概,也许对别的场合有用。这一点与“回”字和Perl其实不同。
知道什么情况下可以查字典即可,不用背下字典。不过如果能像诺先生那样在几秒内用微积分解答了追及问题,也是不错的。
言归正传。个人认为,在这10种方法中:
1-3: 基本方法,值得记住
4-8: 值得了解,有些方法用于某些情况会很好用
9-10: 似乎无趣,至少对本问题
其实,对于这个问题本身,只要知道方法1-3,甚至只要知道方法1,便已经够了;
但往往遇到的是另一个问题: 如何让一个string的值是 n 个相同的字符?
看下文,使用方法3最方便,而方法5、6、7、8 (即 append, assign, insert, replace), 则可以解决这个问题的变种。
以下内容译自: 10 ways to convert a char to a string in C++,顺序略有调整。
- 使用 std::string::operator =
#include <iostream>
#include <string>
int main()
{
char c = 'A';
std::string s;
s = c;
std::cout << s << '\n';
return 0;
}
[译注:不存在 string s = c; 这样的写法,因为没有这样的构造函数。]
- 使用 std::stringstream
#include <iostream>
#include <string>
#include <sstream>
int main()
{
char c = 'A';
std::string s;
std::stringstream ss;
ss << c;
ss >> s; // or s = ss.str();
std::cout << s << '\n';
return 0;
}
- 利用填充构造函数 string(size_t n, char c)
该函数将填充 char c 的 n 个拷贝到string中。
char c = 'A';
std::string s(1, c);
- 使用 std::string::push_back
s.push_back(c);
- 利用 string& std::string::append(size_t n, char c)
append()函数将追加 char c 的 n 个拷贝到string的末尾
std::string s;
s.append(1, c);
- 利用 string& std::string::assign(size_t n, char c)
assgin()函数将使用 char c 的 n 个拷贝来替换string当前的值
std::string s;
s.assign(1, c);
- 利用 string& std::string::insert(size_t pos, size_t n, char c)
insert()函数将 char c 的 n 个拷贝插在位置 pos 处
std::string s;
s.insert(0, 1, c);
[译注: 关于此方法的更普遍用途,见下例:
char c = 'A';
std::string s = "abc";
s.insert(1, 3, c); // aAAAbc
]
- 利用 string & std::string::replace(size_t pos, size_t len, size_t n, char c)
replace()函数将 string s 在位置 pos 处开始的 len 个字符替换为 char c 的 n 个拷贝
std::string s;
s.replace(0, 1, 1, c);
[译注: 关于此方法的更普遍用途,见下例:
char c = 'A';
std::string s = "abcdef";
s.replace(1, 2, 3, c); // aAAAdef
]
- 使用 string& std::string::operator +=
char c = 'A';
std::string s;
s += c;
- 将 char 转成 c-string,再利用填充构造函数或string::append()或string::assign()来转换
#include <iostream>
#include <string>
int main()
{
char c = 'A';
// converting char to c-string
const char* str = &c;
// using std::string fill constructor
std::string s(str, 1);
std::cout << s << '\n';
// using std::string::append
std::string S;
S.append(str, 1);
std::cout << S << '\n';
// using std::string::assign
S.assign(str, 1);
std::cout << S << '\n';
return 0;
}
[译注:以上代码中的 std::string s(str, 1), S.append(str, 1), S.assign(str, 1), 和之前几种方法中的并不是相同的函数。
本方法中的原型是:
string (const char* s, size_t n);
string& append (const char* s, size_t n);
string& assign (const char* s, size_t n);
这几个方法都是从s地址开始取n个字符。
另:这个作者之所以能整出“回”字的10种写法,主要还是他对string的各成员函数有过一番研究。
]
(完)