web-dev-qa-db-ja.com

C ++で単一の文字を小文字に変換します-tolowerは整数を返します

文字列を小文字に変換しようとしていますが、それをchar *として扱い、各インデックスを繰り返し処理しています。問題は、オンラインで読んだtolower関数が実際にcharを小文字に変換していないことです。charを入力として受け取り、整数を返します。

_cout << tolower('T') << endl;
_

Tを出力する必要があるときに_116_をコンソールに出力します。

文字列を小文字に変換するより良い方法はありますか?私はオンラインで調べましたが、ほとんどの情報源は"tolowerを使用してchar配列を反復処理する"と言っていますが、これは私にはうまくいかないようです。

だから私の2つの質問は次のとおりです。

  1. tolower('T')を呼び出すと、tolower関数が 't'ではなく116を返すようにして、何が問題になっていますか?

  2. 個々の文字にtolowerを使用する以外に、C++で文字列を小文字に変換するより良い方法はありますか?

7
user83676

これは、2つの異なるtolower関数があるためです。あなたが使っているのは this one で、これはintを返します。これが116を出力する理由です。これが't'のASCII値です。charを出力する場合は、char

または、 this one を使用することもできます。これは、実際に返されると予想されるタイプを返します。

std::cout << std::tolower('T', std::locale()); // prints t

2番目の質問への回答:

個々の文字にtolowerを使用する以外に、C++で文字列を小文字に変換するより良い方法はありますか?

いいえ。

12
Barry

116は確かに正しい値ですが、これは_std::cout_が整数を処理する方法の問題であり、char(tolower(c))を使用して目的の結果を達成します。

_std::cout << char(tolower('T')); // print it like this
_
2
user4578093

それよりもさらに奇妙です-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つの文字を変換することは非常に制限されます。たとえば、「ß」を大文字に変換してみてください。

2
Alan Stokes

下げるのは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 
}
_
1
Nikola Butigan

int to_lower(int ch)のドキュメントでは、chがunsigned charとして表現可能であるか、EOFと等しい必要があります(これは通常です-1、ただしそれに依存しないでください)。

C標準ライブラリから継承された文字操作関数がintの観点から機能することは珍しいことではありません。これには2つの理由があります。

  1. Cの初期の頃は、すべての引数がintに昇格されました(関数プロトタイプは存在しませんでした)。

  2. 一貫性を保つために、これらの関数はEOFの場合を処理する必要があります。明らかな理由により、charで表現できる値にすることはできません。これは、文字の正当なエンコーディング。

http://en.cppreference.com/w/cpp/string/byte/tolower

答えは、印刷する前に結果をcharにキャストすることです。

例えば。:

std::cout << static_cast<char>(std::to_lower('A'));
1
Richard Hodges