编码中有可能会遇到给定的是含文件后缀的文件全名,如果只展示、输出文件名,需要进行一些处理。 以下说的c string函数需要 #include <cstring> ;C++ STL string需要 #include <string>
自己解决该问题的场景为:代码中使用到了glog,对glog输出内容定制时,需要输出不要后缀的文件名。
1、strtok函数 – C string函数
使用strtok获取文件名
函数定义于<cstring> 中,获取文件名的方法
char padd[] = "main.cpp";
char *p = strtok(padd, ".");
std::cout << p << std::endl;
std::cout << padd << std::endl;
以上代码输出内容为:
main
main
至于padd内容被改变,其原因如下分析。
strtok函数相关说明
strtok函数原型:
char * strtok ( char * str, const char * delimiters );
strtok() 函数将会改变str参数的值,同时 delimiters 参数可以是一个字符串strtok() 函数将会把指定的delimiters都进行替换,如下代码:
char padd[] = "Hello.cpp, world.cpp";
char *p = strtok(padd, ".,");
while (p != NULL)
{
std::cout << p << std::endl;
p = strtok(NULL, ".,");
}
其输出结果为:
Hello
cpp
world
cpp
strtok() 函数执行后 padd的内部结果如下所示,非常清晰。
- 如果是对 const char* 获取文件后缀,可以先使用
strncpy() 进行字符串拷贝,然后使用 strtok() 函数。
关于strtok() 函数,如果看详细介绍,可参考:【cplusplus – strtok】
2、string相关函数 – C++ STL 函数
也可以直接使用 STL中string的相关成员函数
std::string str("Hello.cpp, world.cpp");
size_t found = str.find_last_of('.');
if(found != std::string::npos)
{
std::cout << str.substr(0, found) << std::endl;
}
以上代码输出结果:
Hello.cpp, world
关于string中 find_last_of 和 rfind的比较
- 如果传入的是单个字符,没区别
- 但如果传入的字符串,区别较大:
find_last_of 是匹配其中一个,返回最长的位置
- Searches the string for the last character that matches
any of the characters specified in its arguments. - Finds the last character equal to one of characters in str
- this means when searching the string “I Like C++ Tutorial” for the string “Like” the last character that apears in both strings is “i” wich is at position 16.
rfind 是完全匹配,如果没找到将返回 std::string::npos - 参考:【stackoverflow – How std::find_last_of actually works?】
3、参考:
|