string::substr() 返回一个空字符串

Posted

技术标签:

【中文标题】string::substr() 返回一个空字符串【英文标题】:string::substr() returns a blank string 【发布时间】: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的值是多少呢? 【参考方案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

以上是关于string::substr() 返回一个空字符串的主要内容,如果未能解决你的问题,请参考以下文章

JS中substr和substring的用法和区别

[JS]string.substr(start,length)

String 常用方法

string字符串截取substr

使用命令 std::string::substr 在 C++ 中拆分字符串

C++ 17:string_view