0

だから、私はRedditの毎日のプログラマー#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'

何が原因ですか?前もって感謝します!

4

3 に答える 3

4

いいえ

std::touppper

しかし

std::toupper

関数にロケールを渡す必要があります。例を参照してください: http://www.cplusplus.com/reference/locale/toupper/

于 2013-11-09T20:20:09.213 に答える
1

std::touppperp3 :) ではなく2 で綴られているため、存在しません。std::eraseは標準関数ではありません。これを確認してください: std::erase を理解するのに役立ちます

于 2013-11-09T20:24:50.857 に答える
0

std::toupper()おそらく、実装の基礎として使用したいと思うでしょう。ただし、std::toupper()はその引数を として取り、int引数が の正の値である必要があることに注意してくださいEOF。引数が 1 つのバージョンの に負の値を渡すstd::toupper()と、未定義の動作が発生します。が署名されているプラ​​ットフォームでcharは、負の値を簡単に取得できます。たとえば、私の 2 番目の名前で 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文字列がスペースで終わっている場合、最後のスペースを吹き飛ばした後に index の文字にアクセスしたくないことに注意してください!

于 2013-11-09T20:29:46.190 に答える