gpt4 book ai didi

c++ - 为什么调用istream::getline后可以打印字符串 '\0'之后的部分

转载 作者:行者123 更新时间:2023-11-30 02:21:22 24 4
gpt4 key购买 nike

为了巩固我对 istream::getline 的理解,我测试了以下代码:

#include <iostream>
#include <sstream>
using namespace std;
int main()
{
string s("abcdefgh \nijklmnopqrst");
string s1;
stringstream ss(s);
ss >> s1;
cout <<"s1:"<< s1 << endl;
ss.getline(&s1[0], 250, '\n');
if(s1[0]==' '&&s1[1]=='\0')
cout << "new s1:"<<s1 << endl;
getchar();
return 1;
}

据我了解,ss.getline 调用将提取空格和终止符 '\n' 然后分配空格和 '\0' s1[0]s1[1] 分别引用 cpluscplus , s1[1] 之后的字符保持不变,因为一旦到达终止符,提取就会停止。但是一个意想不到的问题是s1可以打印出来。控制台打印

s1:abcdefgh
new s1: cdefgh

为什么在这种情况下可以打印字符串的'\0'之后的部分?

最佳答案

C++ 字符串和使用它们的 I/O 工具并不真正关心 NUL 字节。他们知道自己的长度,如果他们的数据是 N 字节长,那么其中一些字节是否为 NUL 并不重要,iostream 将继续运行直到到达记录的长度(当您使用 ss >> s1; 阅读时设置)。

当你这样做时,你在这里明显滥用了你的字符串:

ss.getline(&s1[0], 250, '\n');

因为 &s1[0] 正在绕过 std::string 的安全访问器来获取原始 char*(更糟的是,你告诉getline 它最多可以拉取 250 个字符,当底层缓冲区可能小得多时),并保持长度/容量信息不变(因此它仍然认为它包含了很多字符 ss >> s1; 阅读)。

你真的想要 std::getline ,它是面向 std::string 的,并且可以正常工作(包括根据需要调整输出大小,调整已知字符串长度,确保现有数据不会留在原地):

std::getline(ss, s1, '\n');

关于c++ - 为什么调用istream::getline后可以打印字符串 '\0'之后的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48414497/

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