文字列を小文字に変換しようとしていますが、それをchar *として扱い、各インデックスを繰り返し処理しています。問題は、オンラインで読んだtolower
関数が実際にcharを小文字に変換していないことです。charを入力として受け取り、整数を返します。
_cout << tolower('T') << endl;
_
T
を出力する必要があるときに_116
_をコンソールに出力します。
文字列を小文字に変換するより良い方法はありますか?私はオンラインで調べましたが、ほとんどの情報源は"tolower
を使用してchar配列を反復処理する"と言っていますが、これは私にはうまくいかないようです。
だから私の2つの質問は次のとおりです。
tolower('T')
を呼び出すと、tolower
関数が 't'ではなく116を返すようにして、何が問題になっていますか?
個々の文字にtolower
を使用する以外に、C++で文字列を小文字に変換するより良い方法はありますか?
116は確かに正しい値ですが、これは_std::cout
_が整数を処理する方法の問題であり、char(tolower(c))
を使用して目的の結果を達成します。
_std::cout << char(tolower('T')); // print it like this
_
それよりもさらに奇妙です-int
を取り、int
を返します。 http://en.cppreference.com/w/cpp/string/byte/tolower を参照してください。
渡す値がunsigned char
として表現可能であることを確認する必要があります-char
が署名されている場合でも、負の値は許可されません。
したがって、次のような結果になる可能性があります。
char c = static_cast<char>(tolower(static_cast<unsigned char>('T')));
醜いですね。ただし、いずれの場合も、一度に1つの文字を変換することは非常に制限されます。たとえば、「ß」を大文字に変換してみてください。
下げるのはintなので、intを返します。 _#include <ctype>
_をチェックすると、定義がint tolower ( int c );
であることがわかります。ループを使用して文字列をトラフし、すべての文字を小文字に変更できます。例えば
_while (str[i]) // going trough string
{
c=str[i]; // ging c value of current char in string
putchar (tolower(c)); // changing to lower case
i++; //incrementing
}
_
int to_lower(int ch)
のドキュメントでは、chがunsigned char
として表現可能であるか、EOF
と等しい必要があります(これは通常です-1、ただしそれに依存しないでください)。
C標準ライブラリから継承された文字操作関数がintの観点から機能することは珍しいことではありません。これには2つの理由があります。
Cの初期の頃は、すべての引数がintに昇格されました(関数プロトタイプは存在しませんでした)。
一貫性を保つために、これらの関数はEOFの場合を処理する必要があります。明らかな理由により、char
で表現できる値にすることはできません。これは、文字の正当なエンコーディング。
http://en.cppreference.com/w/cpp/string/byte/tolower
答えは、印刷する前に結果をcharにキャストすることです。
例えば。:
std::cout << static_cast<char>(std::to_lower('A'));