gpt4 book ai didi

c++ - 遇到问题 string::find

转载 作者:行者123 更新时间:2023-11-28 00:33:33 24 4
gpt4 key购买 nike

我正在编写一个 C++ 程序来解析 Web 日志中的片段,我想要的片段之一是请求的页面。我使用 string::find 来定义页面的开始和结束,然后使用 string::substr 来提取它。这是一个示例行:

172.138.80.174 - - [05/Aug/2001:21:06:27 -0300] "GET /~csc226 HTTP/1.0" 301 303 "http://www.goto.com/d/search/?Keywords=stringVar+%2B+savitch&view=2+80+0&did=" "Mozilla/4.61 [en] (Win98; I)"

请求的页面是 GET 之后的部分,end 恰好在 HTTP 之前,所以我做了这样的事情:

int beginning = log_entry.find("\"GET") + 5;
int end = log_entry.find("HTTP) - 5;
std::string requested_page = log_entry.substr(beginning, end);

这就是 requested_pa​​ge 中包含的内容:

/~csc226 HTTP/1.0" 301 303 "http://www.goto.com/d/search/

代替

/~csc226

如您所见,开头是正确的,但结尾不是。我有一个 3000 行的日志,其语法与上面的示例条目相同,并且所有请求页面的开头都是正确的,结尾不是。

有什么问题吗?

谢谢!

最佳答案

不要将 find 的结果存储在 int 中。使用 std::string::size_type 又名 std::size_t

要测试它是否失败,然后与 std::string::npos 进行比较。

其次,永远不要操纵 std::string::find 的结果,直到你们都确认它不是 npos 并且知道操纵将它移动到有效范围内范围。 +5-5 盲目是行不通的。我不在乎你是否“知道”你的数据是什么。不要编写缓冲区溢出罪魁祸首的代码。

最后,substr( start, LENGTH ) 而不是 substr( start, end )

std::string 是从与标准容器不同的源库中导入的。所以它的约定非常不同(而且通常更糟)。

关于c++ - 遇到问题 string::find,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21837375/

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