gpt4 book ai didi

c++ - 为什么C++ STL字符串的find函数有时出错有时正确?

转载 作者:行者123 更新时间:2023-12-03 12:51:58 25 4
gpt4 key购买 nike

我正在尝试在 Ubuntu 16.04(GCC&G++ 5.4 和 CMake 3.5.1)中使用 C++ 读取一些文件。测试文件(名为123.txt)只有一行字,如下所示:

Reprojection error: avg = 0.110258   max = 0.491361

我只想获取 avg 错误和 max 错误。我的方法是获取一行并将它们放入 std::string 并使用string::find。我的代码非常简单,就像这样:

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

int main()
{
FILE *fp = fopen("123.txt", "r");
char tmp[60];
string str;
fgets(tmp, size_t(tmp), fp);
fclose(fp);
cout << tmp << endl;
str = tmp;
cout << str.size() << endl;
size_t avg = str.find("avg");
size_t max = str.find("max");
cout << avg << endl;
cout << max << endl;
}

我可以使用g++成功编译它。但我遇到了一个奇怪的问题。

当我第一次在命令中运行它时,它将得到正确的结果:

Reprojection error: avg = 0.110258   max = 0.491361

52
20
37

如果我再次运行代码,有时会出错,如下所示:

p
2
18446744073709551615
18446744073709551615

“p”是乱码,在命令中无法正确显示。我不擅长C++并且对此感到困惑。有没有人可以说一下?谢谢!

最佳答案

表达式

fgets(tmp, size_t(tmp), fp);

格式不正确,size_t(tmp) 将无法按您的预期工作,您需要 sizeof(tmp)

你得到的52值是因为fgets消耗了\n字符,这个也被计算在内,实际上字符串有 51 个字符(以空格计)。

也就是说,在这种情况下,您可以使用更好的 C++ 工具来替换您正在使用的 C 工具,fopen 可以替换为使用 fstream 库,fgets 可以替换为 getline

类似于:

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

int main()
{
std::ifstream fp("123.txt"); //C++ filestream

if (fp.is_open()) {//check for file opening errors

std::string str;
std::getline(fp, str); //C++ read from file
fp.close();
std::cout << str << std::endl;
std::cout << str.size() << std::endl;
size_t avg = str.find("avg");
size_t max = str.find("max");
std::cout << avg << std::endl;
std::cout << max << std::endl;
}
else{
std::cerr << "Couldn't open file";
}
}

请注意,我没有使用 using namespace std;,这是有原因的,这不是一个好的做法,您可以检查 this thread了解更多详情。

关于c++ - 为什么C++ STL字符串的find函数有时出错有时正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61909311/

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