找不到toupper和erase

时间:2013-11-09 20:16:10

标签: c++

所以,我一直在做Reddit的daily programmer #140,不能使用std :: toupper和std :: erase。

包括:

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

部分使用toupper和erase(用于将单词转换为'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'

可能导致什么?提前谢谢!

3 个答案:

答案 0 :(得分:4)

std::touppper

但是

std::toupper

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

答案 1 :(得分:1)

std::touppper不存在,因为拼写为两个p,而不是三个:)。 std::erase不是标准函数,请查看:Help me understand std::erase

答案 2 :(得分: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处的字符!