我想提取给定字符串的最后一部分。以下是代码段:
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;从整个字符串中删除。
答案 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"