在编写应用程序时,我们经常要使用到字符串。C++标准库中的<string>和<sstream>为我们操作字符
串提供了很多的方便,例如:对象封装、安全和自动的类型转换、直接拼接、不必担心越界等等。但今天我们并不想长篇累牍得去介绍这几个标准库提供的功能,而
是分享一下stringstream.str()的一个有趣的现象。我们先来看一个例子:
1 #include <string>
2 #include <sstream>
3 #include <iostream>
4
5 using namespace std;
6
7 int main()
8 {
9 stringstream ss("012345678901234567890123456789012345678901234567890123456789");
10 stringstream t_ss("abcdefghijklmnopqrstuvwxyz");
11 string str1(ss.str());
12
13 const char* cstr1 = str1.c_str();
14 const char* cstr2 = ss.str().c_str();
15 const char* cstr3 = ss.str().c_str();
16 const char* cstr4 = ss.str().c_str();
17 const char* t_cstr = t_ss.str().c_str();
18
19 cout << "------ The results ----------" << endl
20 << "cstr1:t" << cstr1 << endl
21 << "cstr2:t" << cstr2 << endl
22 << "cstr3:t" << cstr3 << endl
23 << "cstr4:t" << cstr4 << endl
24 << "t_cstr:t" << t_cstr << endl
25 << "-----------------------------" << endl;
26
27 return 0;
28 }
在看这段代码的输出结果之前,先问大家一个问题,这里cstr1、cstr2、cstr3和cstr4 打印出来结果是一样的么?(相信读者心里会想:结果肯定不一样的嘛,否则不用在这里“故弄玄虚”了。哈哈)
接下来,我们来看一下这段代码的输出结果:
------ The results ----------
cstr1: 012345678901234567890123456789012345678901234567890123456789
cstr2: 012345678901234567890123456789012345678901234567890123456789
cstr3: abcdefghijklmnopqrstuvwxyz
cstr4: abcdefghijklmnopqrstuvwxyz
t_cstr: abcdefghijklmnopqrstuvwxyz
-----------------------------
这里,我们惊奇地发现cstr3和cstr4竟然不是ss所表示的数字字符串,而是t_ss所表示的字母字符串,这也太诡异了吧,但我们相信“真相只有一个”。下面我们通过再加几行代码来看看,为什么会出现这个“诡异”的现象。
1 #include <string>
2 #include <sstream>
3 #include <iostream>
4
5 using namespace std;
6
7 #define PRINT_CSTR(no) printf("cstr" #no " addr:t%pn",cstr##no)
8 #define PRINT_T_CSTR(no) printf("t_cstr" #no " addr:t%pn",t_cstr##no)
9
10 int main()
11 {
12 stringstream ss("012345678901234567890123456789012345678901234567890123456789");
13 stringstream t_ss("abcdefghijklmnopqrstuvwxyz");
14 string str1(ss.str());
15
16 const char* cstr1 = str1.c_str();
17 const char* cstr2 = ss.str().c_str();
18 const char* cstr3 = ss.str().c_str();
19 const char* cstr4 = ss.str().c_str();
20 const char* t_cstr = t_ss.str().c_str();
21
22 cout << "------ The results ----------" << endl
23 << "cstr1:t" << cstr1 << endl
24 << "cstr2:t" << cstr2 << endl
25 << "cstr3:t" << cstr3 << endl
26 << "cstr4:t" << cstr4 << endl
27 << "t_cstr:t" << t_cstr << endl
28 << "-----------------------------" << endl;
29 printf("n------ Char pointers ----------n");
30 PRINT_CSTR(1);
31 PRINT_CSTR(2);
32 PRINT_CSTR(3);
33 PRINT_CSTR(4);
34 PRINT_T_CSTR();
35
36 return 0;
37 }