-1

toupper を紹介されたばかりで、構文に少し混乱しています。それを繰り返しているようです。私がこれを使用してきたのは、文字列のすべての文字に対して、可能であれば文字を大文字に変換することです。

for (int i = 0; i < string.length(); i++)
{
    if (isalpha(string[i]))
    {
        if (islower(string[i]))
        {
            string[i] = toupper(string[i]);
        }
    }
}

なぜstring[i]2回リストする必要があるのですか?これはうまくいかないのですか? toupper(string[i]);(私はそれを試したので、そうではないことを知っています。)

4

5 に答える 5

2

documentationからのように、文字は値で渡されます。
そのため、答えはノーです。

のプロトタイプtoupperは次のとおりです。

int toupper( int ch );

ご覧のとおり、文字は値で渡され、変換され、値で返されます。
戻り値を変数に割り当てないと、確実に失われます。
そのため、あなたの例では、元のものを置き換えるために再割り当てされています。

于 2016-02-13T21:33:58.990 に答える
1

他の多くの回答がすでに述べているように、 への引数std::toupperが渡され、結果が値によって返されますstd::toupper('a')'a'リテラルをインプレースで変更することはできません。また、読み取り専用バッファーに入力があり、大文字の出力を別のバッファーに格納したい場合もあります。したがって、値によるアプローチははるかに柔軟です。

一方、冗長なのは とのチェックisalphaですislower。文字が小文字のアルファベット文字でない場合は、そのtoupperままにしておくため、ロジックはこれに縮小されます。

#include <cctype>
#include <iostream>

int
main()
{
  char text[] = "Please send me 400 $ worth of dark chocolate by Wednesday!";
  for (auto s = text; *s != '\0'; ++s)
    *s = std::toupper(*s);
  std::cout << text << '\n';
}

これがよりきれいである場合は、アルゴリズムを使用して生のループをさらに排除できます。

#include <algorithm>
#include <cctype>
#include <iostream>
#include <utility>

int
main()
{
  char text[] = "Please send me 400 $ worth of dark chocolate by Wednesday!";
  std::transform(std::cbegin(text), std::cend(text), std::begin(text),
                 [](auto c){ return std::toupper(c); });
  std::cout << text << '\n';
}
于 2016-02-13T21:46:25.840 に答える
0

isalpha() には厄介な落とし穴があることに注意してください。これは次のとおりです。この関数は、0 ~ 255 + EOF の範囲の入力に対してのみ正しく機能します。

どう思いますか。

char 型がたまたま符号付きで、127 より大きい値を渡すと、これは負の値と見なされ、したがって isalpha に渡される int も負になります (したがって、0-255 + EOF の範囲外になります)。 )。

Visual Studio では、これによりアプリケーションがクラッシュします。すべての入力に対して安全ではない文字分類関数は基本的に無意味であるという理由で、Microsoft にこれについて不満を述べましたが、これは完全に標準に準拠しており、より良いコードを作成する必要があるという回答を受け取りました。わかりました、まあまあですが、標準の他のどこにも、char が署名されているか署名されていないかを気にする人はいません。isxxx 関数でのみ、誰にも気づかれずに簡単にテストを通過できる地雷として機能します。

次のコードは、Visual Studio 2015 (および、私の知る限り、以前のすべてのバージョン) をクラッシュさせます。

int x = toupper ('é'); 

したがって、コード内の isalpha() は冗長であるだけでなく、127 より大きい値の文字を含む文字列がアプリケーションをクラッシュさせるため、実際には積極的に有害です。

http://en.cppreference.com/w/cpp/string/byte/isalphaを参照してください: 「ch の値が unsigned char として表現できず、EOF と等しくない場合、動作は未定義です。」

于 2016-02-13T22:28:24.653 に答える