所以,我一直在做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'
可能导致什么?提前谢谢!
答案 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
处的字符!