提供以下代码
inline void inlineConvertPackFilename(char *name)
{
while(*name)
{
if(*name == '\\')
{
*name = '/';
}
else
{
*name = (int) tolower(*name);
}
name++;
}
}
问题很简单,是否存在介绍STL
此功能的任何等效内容?
用法是:
static char filename[MAX_PATH + 1];
inlineConvertPackFilename(filename);
是的我知道这是一个C
代码,但我想要用c ++中的等价物。
答案 0 :(得分:2)
这应该有效:
inline std::string inlineConvertPackFilename(std::string name)
{
std::transform( name.begin(), name.end(), name.begin(), []( char c ) {
if( c == '\\' ) return '/';
return tolower(c);
} );
return name;
}
用法:
auto filename = inlineConvertPackFilename( tmpFilename );
答案 1 :(得分:1)
你可以这样做:
#include <algorithm>
void convert(std::string &name)
{
std::replace(name.begin(), name.end(), '\\', '/');
std::transform(name.begin(), name.end(), name.begin(), ::tolower);
}
问题是std :: replace()仅适用于1:1替换(例如,用一个字符替换另一个字符)。您可以使用它,但如果您需要进行更通用的多字符子串替换,则必须使用string :: find()和string :: replace()来自行编写。
答案 2 :(得分:0)
这使用std::for_each()
,因为您要求STL:
#include <string.h>
#include <string>
#include <algorithm>
void inlineConvertPackFilename(std::string& name)
{
std::for_each(name.begin(), name.end(), [](auto& c) {
if (c == '\\')
{
c = '/';
}
else
{
c = tolower(c);
}
});
}
int main()
{
static std::string filename("C:\\FOO\\bar\\Baz.txt");
inlineConvertPackFilename(filename);
return 0;
}
但这实际上是不必要的,因为您可以改为使用范围for
:
void inlineConvertPackFilename(std::string& name)
{
for (auto& c : name)
{
if (c == '\\')
{
c = '/';
}
else
{
c = tolower(c);
}
}
}