【问题标题】:extracting a file name from file path in c++从c ++中的文件路径中提取文件名
【发布时间】:2018-07-07 14:46:30
【问题描述】:

我有一个文件的字符串存储路径,我正在做一些字符串处理,索引std::string 对象,但输出字符串很奇怪,代码:

#include<iostream>
#include<string>

using namespace std;

int main()
{
    string x = "C:\\Users\\lenovo\\Desktop\\QBFdata.txt";
    string temp = "";
    for(int  i = x.length() - 1; i > 0; i--)
    {
        if(x[i] == '\\')
            break;
        else
            temp.append(&x[i]);
    }
 cout << temp << "\n";
}

但输出显然很奇怪,它再次将temp 的内容附加到它。

txttxt.txta.txtta.txtata.txtdata.txtFdata.txtBFdata.txtQBFdata.txt

请不要提出任何替代方案,因为我已经有了解决方案

int main()
{
    string x = "C:\\Users\\NK\\Desktop\\QBFdata.txt";
    int pos = x.find_last_of('\\');
    string temp = x.substr(pos + 1);
    cout << temp;
}

效果很好。

我想知道第一个代码有什么问题。

谢谢。

我正在使用代码块 16.01

【问题讨论】:

标签: c++ indexing stdstring


【解决方案1】:

好的,如下所示:

您的原始代码首先从字符串的后面开始,因此您的代码第一次运行if(x[i] == '\\') 行时,它正在查看x[34]

x[34] 是路径末尾的 "t"

接下来,您的代码会将其附加到尚未为空的临时字符串中。

下次迭代时,它会查看x[33]

x[33] 是对'x' 字符的引用。现在,如果您一次只附加一个字符,一切都会好起来的(除了您的字符串会向后)。然而,一个字符串的 append 函数追加了另一个字符串,所以我认为发生了什么(如果我错了,有经验的程序员请纠正我),我认为编译器正在从 char* 进行隐式转换(这就是 C样式字符串是如果它以 null 结尾)到 std::string 对象并附加该字符串。

这意味着它从 'x' 字符开始附加 c 字符串,所以这次它将 "xt" 从上方附加到 t 的后面。

下一次迭代引用从 x[32] 开始的 c 字符串,因此它附加了 "txt" 下一次迭代引用从 x[31] 开始的 c 字符串,因此它附加 ".txt" 下一次迭代引用从 x[30] 开始的 c 字符串,因此它附加 "a.txt" 然后"ta.txt"等等...

total 它为您提供以下字符串,所有这些字符串都按以下顺序附加:

"t" + "xt" + "txt" + ".txt" + "a.txt" + "ta.txt" + "ata.txt" + "data.txt" + "Fdata.txt" + "BFdata.txt" + "QBFdata.txt"

将您的最终字符串呈现为:"txttxt.txta.txtta.txtata.txtdata.txtFdata.txtBFdata.txtQBFdata.txt"

希望这会有所帮助。

编码愉快! :)

【讨论】:

    【解决方案2】:

    正如其他人所说,问题在于您使用了错误的 std::string::append() 重载,因此您在每次循环迭代时都附加了整个子字符串,而不是单个字符。

    要一次附加一个字符,请改用以下之一:

    temp.append(&x[i], 1);
    

    temp.push_back(x[i]);
    

    temp += x[i];
    

    但是,由于您正在向后循环,因此您需要在字符串的 FRONT 中添加每个字符,而不是 append 到 BACK:

    temp.insert(0, &x[i], 1);
    

    temp = x[i] + temp;
    

    【讨论】:

      【解决方案3】:

      你得到这个输出的原因是因为当你这样做时:

      temp.append(&x[i]);
      

      不附加单个字母, 而是字符串的整个后缀,来自索引i。 这是我在每次迭代中打印 temp 时代码的输出

      temp.append(&x[i]);
      cout << temp << "\n";
      

      输出显示您首先附加单个字母 t,然后是 xt,然后是 txt,等等。

      t
      txt
      txttxt
      txttxt.txt
      txttxt.txta.txt
      txttxt.txta.txtta.txt
      txttxt.txta.txtta.txtata.txt
      txttxt.txta.txtta.txtata.txtdata.txt
      txttxt.txta.txtta.txtata.txtdata.txtFdata.txt
      txttxt.txta.txtta.txtata.txtdata.txtFdata.txtBFdata.txt
      txttxt.txta.txtta.txtata.txtdata.txtFdata.txtBFdata.txtQBFdata.txt
      txttxt.txta.txtta.txtata.txtdata.txtFdata.txtBFdata.txtQBFdata.txt
      

      【讨论】:

        猜你喜欢
        • 2016-06-19
        • 2010-10-01
        • 2011-04-28
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多