从路径返回文件名

Return filename from path

本文关键字:文件名 返回 路径      更新时间:2023-10-16

我哪里做错了?

电话

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类。