为什么将字符分配给C++字符串会导致字符串长度为0

Why assigning characters to C++ string results in string having 0 length?

本文关键字:字符串 分配 字符 C++ 为什么      更新时间:2023-10-16

我手动将字符串中的字符分配给另一个字符串数组。但是为什么它会导致长度为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::命名空间。