替换文件扩展名时崩溃

时间:2014-10-11 19:03:59

标签: c++ string replace

我尝试创建字符串来替换目录中的.png和.jpg文件(其中的所有文件只包含这些扩展名)和.txt使用.replace命令,如下所示:

//say path is directory
path.replace(path.end()-3, path.end()-1, "txt");

但是我的程序一直在崩溃,我做错了什么?它找到了这个' png'部分正确,但替换不起作用。

enter image description here

这就是我这样做时会发生什么。

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

enter image description here

3 个答案:

答案 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

Demo.

答案 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