【问题标题】:string::substr() returns a blank stringstring::substr() 返回一个空字符串
【发布时间】:2017-11-24 19:32:02
【问题描述】:

下一段代码将文件名作为字符串,如果文件是位图(扩展名 .bmp),则应该返回不带扩展名的名称。

InputPicFolder 是一个包含输入文件夹路径的字符串。

path p(InputPicFolder);
for (auto i = directory_iterator(p); i != directory_iterator(); i++)
{
    if (!is_directory(i->path())) //eliminate directories
    {
        string filename = i->path().filename().string();
        //string filename = "APicture.bmp"; 
        int len = filename.length();
        if (len > 4)
        {
            size_t found = filename.find('.');
            string EXT = filename.substr(found + 1);
            if (EXT.compare("bmp") == 0) 
            {
                string filenameWOExtension = filename.substr(0, found);
                cout << filenameWOExtension;
            }
        }
    }
}

但是我得到一个空字符串作为filenameWOExtension的输出

有人知道我做错了什么吗?我觉得这是一个非常愚蠢的问题,我疲惫的眼睛看不到。

edit - 使用 boost 部分更新了代码。似乎没有改变结果。即使我用“APicture.bmp”覆盖字符串,我的输出仍然是""

编译器 - MSVC14.1

【问题讨论】:

  • 使用boost::filesystem::path 或新的std 版本(如果可用)将是处理这些事情的好主意。
  • 您是否尝试 (1) 在调用 substr 之前打印 found 的值? (2) 确保您的输出缓冲区在程序停止之前被刷新?
  • 我不能reproduce你的问题。
  • @RayToal (1) 我没有明确打印它,我正在使用 VS 调试器来观察变量。 (2) 试试这个
  • @Roy2511 那么found的值是多少呢?

标签: c++ string substring


【解决方案1】:

你的代码对我有用:

#include <string>
#include <iostream>
using namespace std;

int main() {
    string filename = "APicture.bmp"; // *** I Changed this
    int len = filename.length();
    if (len > 4)
    {
        size_t found = filename.find('.');
        string EXT = filename.substr(found + 1);
        if (EXT.compare("bmp") == 0)
        {
            string filenameWOExtension = filename.substr(0, found); //should be "APicture"
            cout << filenameWOExtension;
        }
    }
}

我所做的唯一更改是您获取源字符串的方式。您是否可能没有在您认为的字符串中进行搜索?

如果我的完整程序没有产生输出:APicture,您应该提供有关您的编译器和运行时环境的更多信息。这与 std::string 接口一起编译,但它是实际的 std::string 还是类似的东西?

另外,为什么要使用 compare() 而不是普通的 == 来比较 2 个字符串?

【讨论】:

  • 不,文件名直接来自 boost。编译器 - MSVC14.1 文件名 var 实际上是一个 std::string
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多