c++字符串问题

浏览:40日期:2023-05-16

问题描述

代码如下图所示,在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;}

运行结果:

c++字符串问题

问题解答

回答1:

#include <iostream>#include <string>int main(){ std::string str1 = 'test'; //有效长度4(不包含’0’) std::string str2; //有效长度0 //前面声明其实和 str1[4], str2[0]没什么不同 // c++ string类并没有智能到 像其他的一些语言 // 你访问没有分配的字符下标 自动分配内存的地步 // 正如str2[0] 你并没有分配任何内存,也就不能访问了 if (str2[0] == ’0’) //这个访问是 错误的,如果你判断是否为空请用 .emptystd::cout << 'yes' << std::endl; str1[0] = ’a’; //如果你非要这么做可以使用 .insert的重载 str2[0] = ’b’; std::cout << str1 << ’n’ << str2 << ’n’;str2[1] =’0’; std::cout << str1 << ’n’ << str2 << ’n’; return 0;}回答2:

根据你的题意.你创建了 str1 ,他是指向五个byte的.而str2 是空的.所以你用str1[0]str1[1]str1[2]str1[3]str1[4] 都没什么问题但是,你用 str2[0] 就有问题了.他其实未指向什么内存.个人建议.你用C++,不建议用C语言里数组下标来访问.使用string自带的一些函数来访问会更好.

回答3:

你在输出的时候,改为输出 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

相关文章: