将find_last_of与string-C ++一起使用

时间:2018-03-22 20:23:27

标签: c++ string

我想提取给定字符串的最后一部分。以下是代码段:

int main ()
{
   const std::string path="C:\Users\rd_nsl_Bentley_1.2.sc";
   auto const pos=path.find_last_of('\\');
   cout<<"pos="<<pos<<endl;
   const auto leaf=path.substr(pos+1);

   std::cout << leaf << '\n';
}

我的输出应该是

leaf rd_nsl_Bentley_1.2.sc

但输出是

pos=18446744073709551615
C:Usersrd_nsl_Bentley_1.2.sc

pos值是任意的,只有&#34; \&#34;从整个字符串中删除。

2 个答案:

答案 0 :(得分:2)

您需要转义字符串文字中的\个字符,就像您传递给find_last_of()的字符文字一样。

从中更改字符串文字:

"C:\Users\rd_nsl_Bentley_1.2.sc"

对此:

"C:\\Users\\rd_nsl_Bentley_1.2.sc"

或者,如果您使用的是C ++ 11或更高版本:

R"(C:\Users\rd_nsl_Bentley_1.2.sc)"

如果你没有逃脱,编译器会将\U\r解释为escape sequences(其中\U无效,因为\Unnnnnnnn不在\r格式,'\'是回车符。它们不会像您期望的那样被解释为单个字符'U''\''r''\'

因此,您的字符串不会有任何find_last_of()字符供18446744073709551615查找,因此它会返回std::string::npos,这是-1(当被解释为pos+1时一个无符号的64位数字),substr()为0,导致std::cout按原样返回原始字符串,\U将忽略\r和{{1转义序列,产生你看到的输出。

答案 1 :(得分:0)

定义path变量时,您无法转义\个字符以将其正确添加到字符串中。它会像您一样将\U\r作为转义字符处理字符串。

更改为"C:\\Users\\rd_nsl_Bentley_1.2.sc"