-2

C ++で小文字を大文字に変換する方法を尋ねているわけではありませんが、代わりに、以下のコードのこれら2つの方法(Upper1とUpper2)のどちらが他の方法よりも優れているか、およびその理由を知りたい、プログラミングに関して。

#include <string>
#include <iostream>
#include <locale> //Upper2 requires this module

using namespace std;

void Upper1(string &inputStr);
void Upper2(string &inputStr);

int main(){

    string test1 = "ABcdefgHIjklmno3434dfsdf3434PQRStuvwxyz";
    string test2 = "ABcdefgHIjklmnoPQRStuvwxyz";

    Upper1(test1);
    cout << endl << endl << "test1 (Upper1): ";
    for (int i = 0; i < test1.length(); i++){
        cout << test1[i] << " ";
    }


    Upper2(test2);
    cout << endl << endl << "test2 (Upper2): ";
    for (int i = 0; i < test2.length(); i++){
        cout << test2[i] << " ";
    }

    return 0;
}

void Upper1(string &test1){

    for (int i = 0; i < 27; i++){ 
        if (test1[i] > 96 && test1[i] <123){ //convert only those of lowercase letters
            test1[i] = (char)(test1[i]-(char)32);
        }

    }
}

void Upper2(string &test2){

    locale loc;

    for (size_t i=0; i<test2.length(); ++i)
        test2[i] = toupper(test2[i],loc);
}
4

3 に答える 3

3

提案された 2 つのソリューションの主な違いは Upper2、プラットフォームに関係なく機能することです。Upper1 エンコーディングに関する仮定を作成し、私が知っている最新のプラットフォームでは機能しません。(これは ASCII を前提としています。ASCII は、すべての意図と目的において、死んでいます。)

もちろん、どちらも実際には機能しません。理由は 2 つあります。1 つ目は、最新のマシンのほとんどがマルチバイト エンコーディング (UTF-8) を使用しているため、一度に文字列を下位から上位に 1 バイトずつ変換できないことです。2 つ目は、一般的に言えば、下位から上位への 1 対 1 の関係がないためです。古典的な例は'ß'であり、大文字に相当するものは 2 文字の文字列"SS"です。それでも、関数のやや単純化された定義と、ISO 8859-1 (おそらく最近では最も広く使用されている) のような単一バイト エンコーディング については 、(入力にUpper2何もない場合) 適切な仕事をします。'ß'多くの用途で使用できますが、Upper1残念ながら失敗します。

于 2012-12-31T13:37:08.483 に答える
2

toupper の使用は、ドイツ語の ä、ö、ü などの英語の AZ アルファベット以外の言語の文字と、フランス語/スペイン語のさまざまなアクセント付き文字がある場合、そしてもちろん、入力が「ドイツ語」の場合は意味がありません。 -latin" 言語、たとえばロシア語。[James が指摘したように、それには Unicode 解析が必要になるかもしれませんが、これはまったく新しい球技です。]

明らかに、最初の関数も入力の最初の 27 文字を変換するようにハードコーディングされています。関数は文字列のサイズに依存すべきではないため、これは不適切なコーディングです。そもそも長さ!

于 2012-12-31T13:39:55.523 に答える
0
  1. toupper()は非ASCII文字を処理できます
  2. 構文的には、Upper2()はエラーが発生しにくいです
  3. これについてはよくわかりませんが、toupper()の方が遅いと思います
于 2012-12-31T13:23:47.867 に答える