gpt4 book ai didi

c++ - 空字符行为 c++

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:06 25 4
gpt4 key购买 nike

#include <iostream>
#include <string>

using namespace std;

int main() {
string s = "hello";

cout << s[5] << endl;
return 0;
}

在上面的代码中,如果我打印 s[5],它会正确打印一个 NULL 字符。但是,如果我将代码更改为:

#include <iostream>
#include <string>

using namespace std;

int main() {
char[] s = {'a','b','c','d','e'};

cout << s[5] << endl;
return 0;
}

它不打印 NULL 字符,而是随机打印一些字符。如果我将字符串存储为 stringchar*,则行为符合我的预期。

但如果我显式声明字符数组,编译器如何知道数组何时结束?数组的大小是否在编译时存储?

最佳答案

字符串文字和 std::string 存储空终止字符串。

但是一个包含 5 个 char 的数组声明如下:

char s[] = {'a','b','c','d','e'};

仅包含 5 个 char,没有空终止符。

但是编译器确实知道s的大小。它是 s 类型的一部分。它没有方便的 .size() 函数,如 std::stringstd::vectorstd::array 可以,但您可以通过以下方式获得它:

sizeof(s) / sizeof(s[0])

或者在 C++11 中更安全:

std::extent<decltype(s)>::value 

或者在 C++17 中:

std::size(s)

( demo )

虽然数组有衰减为指针的习惯,但无法获得大小,您必须自己跟踪它。这就是为什么在 C++ 中首选 std::stringstd::vectorstd::array

关于c++ - 空字符行为 c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31845767/

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