【发布时间】:2015-05-12 22:09:46
【问题描述】:
有一个字符串:
access/2/NOTIF/PI/%24cname%3D/bldg/temp/s/2%24
当我尝试运行以下代码时,
size_t found = str.find_first_of("NOTIF");
if (found != std::string::npos) {
std::cout << "NOTIF found" << " at pos: " << found << std::endl;
std::string substr = str.substr(found+8, m_name.length());
std::cout << "SUBSTR: " << substr << std::endl;
}
我正确地得到了 N 的位置,即 9。但是,当我尝试 subsr 为 '$' 时,它是字符串编码为 %24,它失败了。理想情况下,我希望提取 $ 和 $ 之间的子字符串(即 %24 和 %24 之间)。子字符串不知何故没有将此 %24 识别为 $。
这可能是什么问题?在调用 substr 之前是否必须对其进行预处理?
【问题讨论】:
-
"在调用 substr 之前,我必须对它进行预处理吗?"是的。
-
为什么它不应该失败? “%24”如果绝对不同,那么即使在大小上也是“$”。如果你想实现某种编码,你需要说出这种编码是什么。 C++ 不会猜测您使用哪种编码。您也可以查找“%24”
-
std::string对编码一无所知,它只是字符的容器。所以在你的字符串中%24是3个字符,而std::string不知道$编码为%24。 -
是否有任何编码 API 可以用作预处理器来避免这种情况?
-
@AnilJ 你想多了。
%3D的存在不是问题。也许您认为这是因为您在示例中使用了错误的成员函数进行搜索。find_first_of在搜索字符串中查找 任何 个字符。你想要的是find。