从路径返回文件名
Return filename from path
我哪里做错了?
电话printf(filename(exename));
函数应该返回文件名
const char* filename(const string& str)
{
const char* path;
size_t found;
found=str.find_last_of("/\");
path = (str.substr(found+1)).c_str();
cout << str.substr(found+1); // ------------> is name ok
printf("nn");
printf(path); // ------------> is name not ok random numbers
printf("nn");
return path; // ------------> is not ok random numbers
}
str.substr(found+1)
返回一个临时的 std::string
。在临时 std::string
上调用c_str()
方法,并将返回的指针分配给path
。当临时文件被销毁时(在;
处),您的路径将指向垃圾。
帮自己一个方便,使用 c++ (不是C与c++的混合),使用健壮的字符串类,如std::string
来存储字符串(而不是原始的可能悬空的char*
指针):
std::string FileName(const std::string& str)
{
size_t found = str.find_last_of("/\");
std::string path = str.substr(found+1); // check that is OK
return path;
}
还请注意,您使用path
变量名是令人困惑的,因为该函数似乎返回文件名(而不是路径)。
更简单的重写(不使用path
变量):
std::string ExtractFileName(const std::string& fullPath)
{
const size_t lastSlashIndex = fullPath.find_last_of("/\");
return fullPath.substr(lastSlashIndex + 1);
}
printf("Filename = %sn", ExtractFileName("c:\some\dir\hello.exe").c_str());
…或者只是使用cout
(它可以很好地与std::string
一起使用,并且不需要c_str()
方法调用来获得原始的C字符串指针,就像C printf()
函数一样):
std::cout << ExtractFileName("c:\some\dir\hello.exe");
您正在返回一个指向内存的指针,该指针由临时(str.substr(found+1)).c_str()
持有。当临时超出作用域时,内存可以随时被覆盖。
str.substr(found+1)
是一个返回string
的表达式。该对象是一个临时值,它将在包含它的表达式执行结束时消失。使用.c_str()
,您将获得一个指向该对象控制的内存的指针。在对象生命周期结束后,该指针将不再有效。
尝试将path
声明为string
,并让函数返回string
而不是指针。
一般来说,当您同时使用std::string
类时,应该避免使用原始char *
。这意味着你也应该避免使用printf
;请使用std::iostream
类。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 从命令行c++发送文本文件名
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- C++ GetModule文件名不会返回正确的字符串
- 获取模块文件名不返回路径
- 即使文件名不正确,我的fstream也总是返回true
- assert函数如何在失败时返回文件名和代码行
- 从路径返回文件名
- 文件对象->文件名不返回文件的完整路径