你可以使用_splitpath_s
function to break a path name into its components。我不知道这是标准C还是Windows特定的。反正这是功能:
#include <stdlib.h>
#include <string>
using std::string;
bool splitPath(string const &path, string &drive, string &directory, string &filename, string &extension) {
// validate path
drive.resize(_MAX_DRIVE);
directory.resize(_MAX_DIR);
filename.resize(_MAX_FNAME);
extension.resize(_MAX_EXT);
errno_t result;
result = _splitpath_s(path.c_str(), &drive[0], drive.size(), &directory[0], directory.size(), &filename[0], filename.size(), &extension[0], extension.size());
//_splitpath(path.c_str(), &drive[0], &directory[0], &filename[0], &extension[0]); //WindowsXp compatibility
_get_errno(&result);
if (result != 0) {
return false;
} else {
//delete the blank spaces at the end
drive = drive.c_str();
directory = directory.c_str();
filename = filename.c_str();
extension = extension.c_str();
return true;
}
}
这是一个极大的方便,使用安全std::string
但你可以修改此使用TCHAR*
(wchar
,char
)...
对于您的具体情况:
int main(int argc, char *argv[]) {
string path = argv[0];
string drive, directory, filename, extension;
splitPath(path, drive, directory, filename, extension);
printf("FILE = %s%s", filename.c_str(), extension.c_str());
return 0;
}
[s | f] scanf不能做正则表达式 - 你必须自己编写它(例如strtok) – dialer 2011-04-02 12:08:39
就像拨号器说的,但我也不明白你的正则表达式。匹配文件名就像是“[\\\\//(。+)$”(对用户输入非常宽容和不安全)。 – OlivierD 2011-04-02 13:56:26
找到最后一个反斜杠(从头到尾),它后面是什么文件名 – 2011-04-02 20:16:04