如何将 C 字符串转换为大写

新手上路,请多包涵

我需要将 C++ 中的字符串转换为完全大写。我一直在寻找一段时间,并找到了一种方法:

 #include <iostream>
#include <algorithm>
#include <string>

using namespace std;

int main()
{
    string input;
    cin >> input;

    transform(input.begin(), input.end(), input.begin(), toupper);

    cout << input;
    return 0;
}

不幸的是,这不起作用,我收到了以下错误消息:

没有匹配函数调用’transform(std::basic_string::iterator, std::basic_string::iterator, std::basic_string::iterator,

我尝试了其他也不起作用的方法。这是最接近工作的地方。

所以我要问的是我做错了什么。也许我的语法不好,或者我需要包含一些东西。我不知道。

我的大部分信息都在这里: http ://www.cplusplus.com/forum/beginner/75634/(最后两个帖子)

原文由 Thomas W. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 488
2 个回答

您需要在 toupper 之前放置一个双冒号:

 transform(input.begin(), input.end(), input.begin(), ::toupper);


解释:

有两种不同的 toupper 功能:

  1. toupper 在全局命名空间中(使用 ::toupper 访问),来自 C.

  2. toupperstd 命名空间中(使用 std::toupper 访问),它有多个重载,因此不能简单地用一个名称来引用。您必须将其显式转换为特定的函数签名才能被引用,但获取函数指针的代码看起来很难看: static_cast<int (*)(int)>(&std::toupper)

由于您是 using namespace std ,因此在编写 toupper 时,2. 隐藏 1. 并因此根据名称解析规则被选择。

原文由 leemes 发布,翻译遵循 CC BY-SA 4.0 许可协议

就像 leemes 说的,你可以使用 toupper(int)。 像这样:

 void ToUpper(string &str) {
    for (auto beg = str.begin(); beg != str.end(); ++beg) {
        *beg = toupper(*beg);
    }
}

它将遍历 str 中的每个字符并将其转换为大写。例子:

 int main()
{
    string name;
    cout << "Insert a name: ";
    cin >> name;
    ToUpper(name);
    cout << "Name in upper case: " << name << endl;
}

原文由 Gabriel Bento 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题