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]string.substr(start,length)