gpt4 book ai didi

c++ - 为什么我的字符串的开头消失了?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:58 27 4
gpt4 key购买 nike

在下面的 C++ 代码中,我意识到 gcount() 返回的数字比我想要的要大,因为 getline() 消耗了最后一个换行符但没有t 将其发送到输入流。

不过,我仍然不明白程序的输出。对于输入“Test\n”,为什么我得到“est\n”?为什么我的错误会影响字符串的 first 字符,而不是在末尾添加不需要的垃圾?为什么程序的输出与字符串在调试器中的显示方式不一致(如我所料,“Test\n”)?

#include <fstream>
#include <vector>
#include <string>
#include <iostream>

using namespace std;

int main()
{
const int bufferSize = 1024;
ifstream input( "test.txt", ios::in | ios::binary );

vector<char> vecBuffer( bufferSize );
input.getline( &vecBuffer[0], bufferSize );
string strResult( vecBuffer.begin(), vecBuffer.begin() + input.gcount() );
cout << strResult << "\n";

return 0;
}

最佳答案

我也复制了这个结果,Windows Vista,Visual Studio 2005 SP2。

当我弄清楚到底发生了什么时,我会更新这篇文章。

编辑:好的,我们开始吧。问题(以及人们得到的不同结果)来自\r。您调用 input.getline 并将结果放入 vecBuffer 会发生什么。 getline 函数去掉了\n,但保留了\r。

然后您将 vecBuffer 传输到一个字符串变量,但是使用来自输入的 gcount 函数,这意味着您将得到一个字符太多,因为输入变量仍然包含\n,而 vecBuffer 不包含。

结果 strResult 是:

-       strResult   "Test"
[0] 84 'T' char
[1] 101 'e' char
[2] 115 's' char
[3] 116 't' char
[4] 13 '␍' char
[5] 0 char

然后打印“Test”,然后是回车符(将光标放回行首)、空字符(覆盖 T),最后是\n,它正确地将光标放在新线路。

因此您要么必须去除\r,要么编写一个函数直接从 vecBuffer 获取字符串长度,检查空字符。

关于c++ - 为什么我的字符串的开头消失了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1039627/

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