我尝试创建字符串来替换目录中的.png和.jpg文件(其中的所有文件只包含这些扩展名)和.txt使用.replace命令,如下所示:
//say path is directory
path.replace(path.end()-3, path.end()-1, "txt");
但是我的程序一直在崩溃,我做错了什么?它找到了这个' png'部分正确,但替换不起作用。
这就是我这样做时会发生什么。
string a = dir.getPath(i); //this is ..\data\images\Test0.png
string b = dir.getPath(i).replace(dir.getPath(i).end()-3, dir.getPath(i).end(), "txt"); //crashes
答案 0 :(得分:1)
从第二个参数中删除-1。
string path = "filename.png";
path.replace(path.end() - 3, path.end(), "txt");
路径存储的结果:
"filename.txt"
因为第一个参数指示从哪里开始替换字符,所以第二个参数指示停止的位置(在替换最后一个字符后停止,而不是在它之前的1个位置),最后一个参数指定要替换它的内容。
更新: 为了回答您更新的问题,您可以通过询问自己dir.getPath(i)返回什么来回答您的问题?一个新的字符串实例。您正试图从一个字符串中的迭代器遍历到另一个字符串中的迭代器。
答案 1 :(得分:1)
如果要替换最后三个字符,则需要提供一个包含三个字符的范围。目前,您的范围只有两个字符,即end()-3
(含),end()-1
,独占。
string s("hello.png");
s.replace(s.end()-3, s.end(), "txt");
cout << s << endl;
此外,您需要确保字符串的长度不少于三个字符,否则访问end()-3
是未定义的行为。
另外,请确保多次不使用dir.getPath(i)
,否则end()-3
迭代器和end()
迭代器指向不同的字符串。即。
string b = dir.getPath(i).replace(dir.getPath(i).end()-3, dir.getPath(i).end(), "txt"); // Crashes
// ^^^^^^ ^^^^^^ ^^^^^^^
// Copy # 1 Copy # 2 Copy # 3
需要
string b = dir.getPath(i);
b.replace(b.end()-3, b.end(), "txt"); // Does not crash
答案 2 :(得分:0)
可以通过以下方式完成
#include <iostream>
#include <string>
int main()
{
std::string s( "..\\data\\images\\Test0.png" );
std::cout << s << std::endl;
std::string::size_type pos;
if ( ( ( pos = s.rfind( ".png" ) ) != std::string::npos ) ||
( ( pos = s.rfind( ".jpg" ) ) != std::string::npos ) )
{
s.replace( pos, std::string::npos, ".txt" );
}
std::cout << s << std::endl;
return 0;
}
输出
..\data\images\Test0.png
..\data\images\Test0.txt