gpt4 book ai didi

c++ - 我在 C++ 中遇到字符串和空字符的问题。空字符的行为不同

转载 作者:行者123 更新时间:2023-12-05 01:06:08 30 4
gpt4 key购买 nike

我在 C++ 中遇到了字符串和空字符的问题。当我在字符串之间写 '\0' 并打印字符串时,我只得到 '\0' 之前的部分,但另一方面,当我将字符串作为输入然后将任何索引更改为 '\0' 然后它打印方式不同。为什么会这样以及为什么 sizeof(string) 在这两种情况下都是 32代码如下供引用。请帮忙。

第一个代码:

#include<iostream>
using namespace std;
int main(){
string s = "he\0llo";

cout<<s.length()<<"\n";
cout<<s<<endl;
cout<<sizeof(s)<<"\n";
}

第一个代码的输出:

2\n
he\n
32\n

第二个代码

#include<iostream>
using namespace std;
int main(){
string s;
cin>>s;
s[1] = '\0';
cout<<s<<"\n";
cout<<s.length()<<"\n";
cout<<sizeof(s)<<"\n";
return 0;
}

第二个代码的输出:

hllo\n
5\n
32\n

以下是供您引用的图片。 enter image description here

最佳答案

std::string的隐式 const CharT* 构造函数和赋值运算符不知道字符串参数的确切长度。相反,它只知道这是一个 const char* 并被迫假设该字符串将是 null-terminated,因此使用 std::char_traits::length(...) 计算长度(实际上是 std::strlen )。

因此,构造一个 std::string 对象,其表达式如下:

std::string s = "he\0llo";

将计算 2 作为字符串的长度,因为它假定第一个 \0 字符是字符串的空终止符,而您的第二个示例:

s[1] = '\0';

只是添加一个空字符到一个已经构造的字符串中——这不会改变字符串的大小。

如果你想构造一个中间有一个空字符的字符串,你不能让它为你计算字符串的长度。相反,您必须构造 std::string 并以其他方式为其指定长度。这可以通过 string(const char*, size_t) 构造函数来完成,如果这是一个数组,则可以使用迭代器对:

// Specify the length manually
std::string s{"he\0llo",6};

Live Example

// Using iterators to a different container (such as an array)
const char c_str[] = "he\0llo";
std::string s{std::begin(c_str), std::end(c_str)};

Live Example

注意: sizeof(s) 告诉您 std::string 类本身的大小(以字节为单位),以便您实现标准图书馆。这不会告诉您包含的字符串的长度——可以从 s.length()s.size() 确定。

关于c++ - 我在 C++ 中遇到字符串和空字符的问题。空字符的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69788914/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com