0

所以,我一直在做 Reddit 的日常程序员 #140并且不能使用 std::toupper 和 std::erase。

包括:

#include <iostream>
#include <string>
#include <cctype>

带有 toupper 和擦除的部分(用于将单词转换为 'CamelCase'):

std::string tekst;
std::cin >> tekst;    

tekst[0] = std::touppper(tekst[0]);
for(unsigned int i = 0; i < tekst.size(); i++){
    if(tekst[i] == 32){
        std::erase(tekst[i], 1);
        tekst[i] = std::toupper(tekst[i]);
    }
}

编译器显示错误:

error: 'touppper' is not a member of 'std'
error: 'erase' is not a member of 'std'

什么会导致它?提前致谢!

4

3 回答 3

4

不是

std::touppper

std::toupper

您需要将语言环境传递给函数,例如:http ://www.cplusplus.com/reference/locale/toupper/

于 2013-11-09T20:20:09.213 回答
1

std::touppper不存在,因为它拼写为两个p,而不是三个:)。std::erase不是标准功能,请检查:帮助我理解 std::erase

于 2013-11-09T20:24:50.857 回答
0

您可能希望将其std::toupper()用作实施的基础。但是请注意,这std::toupper()将其参数作为int并要求参数是 的正值EOF。将负值传递给 的一个参数版本std::toupper()将导致未定义的行为。在char已签名的平台上,您将很容易得到负值,例如,当使用我的第二个名字的 ISO-Latin-1 编码时。规范的方法是std::toupper()char转换一起使用unsigned char

tekstr[0] = std::toupper(static_cast<unsigned char>(tekstr[0]));

关于erase()您可能正在寻找std::string::erase()

tekstr.erase(i);

请注意,如果字符串以空格结尾,您不想i在删除最后一个空格后访问索引处的字符!

于 2013-11-09T20:29:46.190 回答