为什么将字符分配给C++字符串会导致字符串长度为0
Why assigning characters to C++ string results in string having 0 length?
我手动将字符串中的字符分配给另一个字符串数组。但是为什么它会导致长度为0并且不能直接打印呢?尽管字符串中的字符可以通过迭代来打印。
代码:
#include <iostream>
#include <string.h>
using namespace std;
int main() {
string domain[100],text="google";
for(int i=0;i<6;i++){
domain[0][i] = text[i];
}
for(int k=0;k<6;k++){
cout<<domain[0][k];
}
cout<<endl;
cout<<"String length: "<<domain[0].length()<<endl;
cout<<"Output string directly from array : "<<domain[0]<<endl;
return 0;
}
输出:
google
String length: 0
Output string directly from array :
通过编写
string domain[100]
您创建了一个由100个空字符串组成的数组,然后尝试使用[]
运算符访问字符串字符,但该字符串没有字符,因此设置它们将不起作用。你甚至不应该尝试以这种方式访问它们。它会导致未定义的行为。
编辑。
在行中:
domain[0][i] = text[i];
您尝试设置第一个字符串的第i个字符。但是这个字符串有多少个字符?没有一个
这就像你尝试这样的东西一样:
domain[0] = "abc";
然后您可以访问domain[0][0]
,但不能访问domain[0][3]
,因为它只有3个字符。试着把它想象成一个数组。如果数组只有5个元素,则不能设置第10个元素。
string domain[100];
现在,您有一个由100个空string
对象组成的数组。
(为什么?你只使用第一个…(
for(int i=0;i<6;i++){
domain[0][i] = text[i];
}
在第一次迭代中,string::operator[]
将返回对CharT()
(空字符(的引用。修改该字符是未定义的行为。(由于C++11;早期版本已经在operator[]
调用了未定义的行为。(
注意,在C++中,null字符实际上并不是字符串的一部分。这与C的char[]
不同。
因此,修改null字符是未定义的行为,实际上并没有向字符串对象添加字符。在第二次迭代中,字符串中仍然没有字符,因此domain[0][1]
是一个越界访问(这也是未定义的行为(。
您可能正在寻找string::operator+=()
或string::push_back()
。。。
无关:
#include <string.h>
这是错误的标题。C++字符串在<strings>
中,<string.h>
是现在不推荐使用的包含C字符串头(strcpy()
等的字符串头(的方式。如果您确实想要,请包含<cstring>
,它将<string.h>
中的名称引入std::
命名空间。
- 我如何通过引用将 c++ 字符串分配给另一个字符串
- 无法在 c++ 中将字符串分配给字符串数据类型
- 将字符串* 分配给字符* c++
- 如何为C++字符串分配空指针参数?
- 为什么在构造函数中将字符串分配给指针是安全的?
- 如何将wchar_t字符串分配给用户定义类的 CString 成员
- 字符串分配
- 如何将字符串分配给向量(均在堆上)
- 确实为其写入的字符串分配内存
- 简单的字符串分配导致分割故障
- 通过新行不使用字符串流将C 字符串分配
- 将字符串分配到动态数组位置时出错
- 在 c++ 中为字符串分配其分配的大小值是否正确
- 从被空间分开的字符串分配给变量?C [QT]
- 将字符串分配给固定长度的字符数组
- 将一组字符串分配给向量c++的内容
- 如何为字符串分配内存
- C++中的字符串分配:为什么这样做
- 视觉 建议在C++中执行字符串分配什么?
- 字符 *str;str= "HELLO" ;如何在不为字符串分配任何内存的情况下工作?