搜尋

首頁  >  問答  >  主體

c++字符串问题

代码如下图所示,在main函数中,有两个string类型的变量,其中一个变量str1我直接初始化,另一个变量str2我没有初始化,但是string类型调用默认构造函数,使得str2 = "\0",是这样吧。我对str1的首字符进行了变换,然后用cout可以在后面输出,为什么我对str2的首字符进行变换后,再用cout输出,但是没有得到正确的输出啊。请问这是怎么回事啊?谢谢。

#include <iostream>
#include <string>

int main()
{
    std::string str1 = "test";
    std::string str2;

    if (str2[0] == '\0')
        std::cout << "yes" << std::endl;

    str1[0] = 'a';
    str2[0] = 'b';
    std::cout << str1 << '\n'
              << str2 << '\n';
    
    str2[1] ='\0';

    std::cout << str1 << '\n'
              << str2 << '\n';

    return 0;
}

运行结果:

PHP中文网PHP中文网2885 天前299

全部回覆(3)我來回復

  • PHP中文网

    PHP中文网2017-04-17 13:30:14

    雷雷

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:30:14

    根據你的題意.
    你創建了str1 ,他是指向五個byte的.
    而str2 是空的.
    所以
    你用str1[0]str1[1 ]str1[2]str1[3]str1[4] 都沒什麼問題
    但是,你用str2[0] 就有問題了.他其實未指向什麼內存.
    個人建議.
    你用C++,不建議用C語言裡數組下標來訪問.
    使用string自帶的一些函數來訪問會更好.

    回覆
    0
  • 阿神

    阿神2017-04-17 13:30:14

    你在輸出的時候,改為輸出 str2.data()試試
    str2[0] = 'b'; 這個操作應不應該有效呢?這個問題值得思考
    因為目前str2是一個空字串,也就是empty()==true;
    那麼它的size()應該就是0,而str2[0]是對第一個元素的訪問。

    這個實際上是和std::string的實作是相關的,你可以試一下,部分編譯器自帶的實現,在這種操作下會出現錯誤。

    /usr/local/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/basic_string.h:707: typename _Alloc::rebind<_CharT>::other::reference std::basic_string<_CharT, _Traits, _Alloc>::operator[](typename _Alloc::rebind<_CharT>::other::size_type) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]: Assertion '__pos < size()' failed.
    
    Disallowed system call: SYS_kill

    回覆
    0
  • 取消回覆