遇到字符串::查找的问题

Having Trouble with string::find

本文关键字:问题 查找 遇到 字符串      更新时间:2023-10-16

我正在编写一个C++程序来解析网络日志中的片段,我想要的片段之一是请求的页面。我使用 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之后的部分,结尾就在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_page中:

/~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是从与标准容器不同的源库导入的。 所以它的惯例非常不同(而且往往更糟)。

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)"

所以: log_entry.find(""GET") + 5;将匹配:"GET,然后将迭代器向前移动 5 位到该位置:

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)"
                                                     ^

下一个 'log_entry.find("HTTP"); 将匹配 HTTP:

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)"
                                                              ^

您想使用 ( size_t length = log_entry.find(""HTTP") - log_entry.find(""GET") - 5; )。最后,您需要在此处正确使用 std::string::substr。