c++ - 字符串初始化和打印
问题描述
C++ Primer,第五版第 3.2.1 条下的表 3.1指出:
string s3("value")
-> s3 是字符串文字的副本,不包括 null。
我对此的解释是——当我们初始化一个类似 的字符串时string s1("value");
,变量s1
包含字符串的副本,末尾没有value
字符NUL
。
#include <iostream>
using std::cin;
using std::string;
using std::cout;
using std::endl;
int main(void)
{
string s1("value");
cout << s1 << endl; // prints - value
}
那么,这个程序是否调用 UB 因为s1
没有NUL
终止符而我们正在打印字符串?
我问这个是因为在 C 中,尝试打印没有NUL
终结符的 c 字符串会产生 UB。C++ 中的字符串不是必须以 a 结尾NUL
吗?
我在这里想念什么?
解决方案
C++ 中的字符串是否必须以 NUL 结尾?
取决于您所说的“字符串”是什么意思。 std::string
不要以 nul 字符结尾,因为长度是已知/存储的。由返回的C 样式字符串(又名char*
数组)std::string::c_str()
必须以 nul 字符结尾,因为长度未知/未存储。
推荐阅读
- java - Spring bean重复:“在null中定义的bean,无法注册”。找不到
- django - 在 Django 中,用户请求对象如何附加到视图?
- java - 如何使用休眠编写事务
- android - 我应该怎么做才能修复 Restore Purchases PaymentPendingError 错误?
- pandas - 根据布尔值选择geopandas df中的列名
- php - 如何在 cURL 数组中传递 PHP $variables
- reactjs - 具有数据依赖性的 React Hooks Fetch API
- gpflow - GPFlow-2.0 - default_float 和似然方差问题
- linux - 如何使用在 Linux Docker 中运行的 XMS .NET Core 应用程序向 IBM MQ 进行身份验证?
- react-native - 反应原生推送通知 OneSignal/Firebase