分享

小心stringstream.str()字符串用法的陷阱

 mediatv 2014-04-25

在编写应用程序时,我们经常要使用到字符串。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  }
      

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多