遇到字符串::查找的问题
Having Trouble with string::find
我正在编写一个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。
- 算法问题:查找从堆栈中弹出的所有序列
- 在 for 循环中查找问题时遇到困难
- 介绍类 在C++中查找圆半径的问题
- 查找不等式为真的次数时出现问题
- Distirbute Candy - 查找问题的最小可重现示例
- 查找在 4 和问题中代码失败的测试用例
- 在文本中查找半个单词"ABBA"的问题
- 查找有问题的宏
- 使用用户定义的函数查找数字的幂时出现问题
- 使用二分法查找数的平方根时出现问题
- 如何解决非限定名称查找问题
- 使用STD :: MAP在数据及其性能问题中查找重复项.我可以预先分配吗?
- 迭代列表以查找元素的出现.代码问题
- 在C++的数组中查找最低值时遇到问题
- 查找料箱包装问题中的所有可能变化
- 关于获取行和字符串查找函数的问题
- C++constexpr数组查找:内存开销?其他问题
- 我的递归算法中的问题,用于查找所有最短、唯一的路径
- 在二叉树中插入/查找问题
- 查找第一个文件问题无法使任何示例正常工作。