【问题标题】:Substring (std::substr) at special characters in C++C++ 中特殊字符的子字符串 (std::substr)
【发布时间】: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

标签: c++ string


【解决方案1】:

理想情况下,我希望提取 $ 和 $ 之间的子字符串(即 %24 和 %24 之间)

然后搜索%24,不必费心将字符串通过某些API 将其转换回$

auto first = s.find("%24");               // Look for first %24
auto second = s.find("%24", first + 1);   // Look for second %24
std::cout << s.substr(first + 3, second - (first + 3)); // This is the substring you're looking for

Live demo

【讨论】:

  • 首先规范化可能会更好,因为并非所有程序(大多数是浏览器)都在 URL 中编码完全相同的字符集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2012-01-07
  • 2017-11-26
  • 1970-01-01
  • 2014-07-12
  • 2019-11-09
  • 2015-07-15
相关资源
最近更新 更多