将字符串转换为大写但出现错误

convert a string into uppercase but getting error?

本文关键字:错误 字符串 转换      更新时间:2023-10-16

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

您的代码混合了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 库代替转换。警告:如果您尚未安装和配置Boost,则它可能是一个非常昂贵的锤子。

#include <boost/algorithm/string.hpp>
...
std::map<std::string, Code>::iterator it = dataHolderMap.find(boost::to_upper_copy(s));

我看到的唯一明显的问题是,您正在将 string 类型的对象传递给采用 char * 类型参数的 convertToUpper() 函数。

您的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(...)