将字符串转换为大写但收到错误?

时间:2015-04-22 00:34:35

标签: c++ string

我有一个字符串,我需要转换为大写。在我的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转换为大写。

2 个答案:

答案 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(...)