2014-10-11 109 views
2

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

//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

+1

我敢打赌'dir.getPath(i)'每次调用时都会返回一个新的字符串。因此'dir.getPath(i).end() - 3'和'dir.getPath(i).end()'是两个迭代器到不同的*字符串中,这两个字符串都不是你调用'replace'的那个。相反,执行'a.replace(a.end()...)' - 调用'getPath'一次,将结果存储在一个变量中,然后处理该变量。 – 2014-10-11 19:21:51

+0

@parameter查看我的回答。 – 2014-10-11 19:35:25

回答

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.

+0

当我这样做时,我得到同样的错误 – parameter 2014-10-11 19:15:38

+0

@parameter这很奇怪。尝试在之前和之后添加一些打印输出,并检查字符串是否足够长,以便进行替换。如果在运行此代码片段之前它们都很好,请运行内存分析器以确保您看到的错误不是由之前的某个错误引起的。 – dasblinkenlight 2014-10-11 19:19:17

+0

我想这是因为我需要获取文件的绝对路径,而不是相对的,请参阅更新后的问题 – parameter 2014-10-11 19:20:27

1

从你的第二个参数中删除-1。

string path = "filename.png"; 
path.replace(path.end() - 3, path.end(), "txt"); 

在路径结果存储:

"filename.txt" 

因为第一参数指示从哪里开始替换字符,所述第二参数指示在哪里停止(停止后更换的最后一个字符之前,而不是1个位置它),最后一个参数指定要用它来替换它。

更新: 为了回应您的更新问题,可以通过询问您的问题来回答您的问题dir.getPath(i)返回的结果是什么?一个字符串的新实例。您试图从一个字符串中的迭代器到另一个字符串中的迭代器。

+0

我试过,但得到相同的错误。 – parameter 2014-10-11 19:14:40

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