我有一个字符串,我需要转换为大写。在我的getCode
方法下面,我有一个字符串s
,我需要将其转换为大写。
static const Code getCode(std::string const& s)
{
static std::map<std::string, Code> dataHolderMap{{"TEXT", TEXT},
{"XML", XML}};
std::map<std::string, Code>::iterator it = dataHolderMap.find(covertToUpper(s));
if ( it != dataHolderMap.end() )
{
return it->second;
}
return XML;
}
这是我添加的将字符串转换为大写的方法,但是我收到了编译错误
const char *covertToUpper(char *str)
{
char *newstr, *p;
p = newstr = strdup(str);
while(*p++=toupper(*p));
return newstr;
}
我得到的错误是:
error: no matching function for call
我在做什么事吗?还有什么是转换为大写的最佳方式?一般来说,我需要将传入的字符串s
转换为大写。
答案 0 :(得分:5)
您的代码混合了C ++字符串和C风格的char *字符串。 s.c_str()可能有效,但在这种情况下无法保证。 convertToUpper(s.c_str())将修改c_str()返回的数组,而C ++不保证这将按照你想要的方式运行。下一个问题是将convertToUpper返回的char *传递给dataHolderMap.find,它需要一个字符串,而不是char *。
最好将字符串保留为字符串。
除非您需要保留输入字符串s,否则请仔细查看std :: transform。如果您需要保留s,请先复制并在副本上运行转换。
std::transform(s.begin(), s.end(), s.begin(), ::toupper);
将执行您想要的转换并将字符串保留为字符串,以便对dataHolderMap.find()的调用获取所需的字符串。
#include <algorithm>
...
std::string uppercase = s;
std::transform(uppercase.begin(), uppercase.end(), uppercase.begin(), ::toupper);
std::map<std::string, Code>::iterator it = dataHolderMap.find(uppercase);
替代方法是使用Boost库代替transform。警告:如果您尚未安装和配置Boost,那么Boost可能是一个非常昂贵的锤子。
#include <boost/algorithm/string.hpp>
...
std::map<std::string, Code>::iterator it = dataHolderMap.find(boost::to_upper_copy(s));
答案 1 :(得分:0)
我看到的唯一明显的问题是,您将string
类型的对象传递给convertToUpper()
函数,该函数采用char *
类型的参数。
您的convertToUpper()
函数应该像这样调用:
convertToUpper(s.c_str());
编辑:在您的评论中,您提到错误:cannot call member function const char* TestClass::covertToUpper(char*) without object
这意味着您的convertToUpper()
函数位于名为TestClass
的类中。由于这是一个成员函数,因此您需要使用一个实例化的TestClass
对象来调用您的函数。
出于您的目的,我建议您将功能声明更改为:
static const char *convertToUpper(char *str)
您可以通过此方式调用convertToUpper()
方法:TestClass::convertToUpper(...)