我想提取给定字符串的最后一部分。下面是代码片段:
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';
}我的输出应该是
叶rd_nsl_Bentley_1.2.sc
但输出是
pos=18446744073709551615
C:Usersrd_nsl_Bentley_1.2.scpos值是任意的,只有"\“从整个字符串中删除。
发布于 2018-03-22 20:28:13
您需要转义字符串文本中的\字符,就像要传递给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解释为逸出序列 (其中\U无效,因为它不是\Unnnnnnnn格式,而\r是回车)。它们不会像您所期望的那样被解释为单个字符'\'、'U'、'\'、'r'。
因此,您的字符串将没有任何'\'字符供find_last_of()查找,因此它将返回std::string::npos,即-1 (当解释为无符号64位数字时的18446744073709551615 ),因此pos+1为0,导致substr()以- is返回原始字符串,std::cout将忽略\U和\r转义序列,从而产生正在看到的输出。
发布于 2018-03-22 20:28:49
定义path变量时,没有转义\字符以正确地将它们添加到字符串中。它将字符串当作转义字符对待,就像您尝试过\U和\r一样。
更改为"C:\\Users\\rd_nsl_Bentley_1.2.sc"
https://stackoverflow.com/questions/49437840
复制相似问题