4

C ++の内部動作についてさらに学ぶために、私は独自の文字列クラスを作成することにしました。しかし、私は.toUpper().toLower()機能に固執しています。これが私のコードです。

Text& toUpper(){
        char* c = this->str;
        while(*c != 0, c++){
            if((*c >= 'a') && (*c <= 'z')){
                *c = *c - 32;                    
                std::cout << *c << std::endl;
            }
        }
        return *this;
    }

セグメンテーション違反の原因となるラインを分離しましたが、*c = *c - 32なぜこれが問題を引き起こすのかわかりません。試し(char)(*c - 32)ましたが、うまくいきませんでした。また、何も出力されないため、これは境界の問題ではありません。何か案は?

更新:私のコンストラクター

Text(char* str){
        this->str = str;
        this->updateLength(); // glorified strlen
    }

私のポインタの定義

private:
    char* str;
    int len;
4

2 に答える 2

5
while(*c != 0, c++)

C++のwhileループは単一の式を取ります。反復ごとにその式を評価して、続行するかどうかを決定します。

ここで、,はコンマ演算子であり、区切り文字ではありません。コンマ演算子は、最初の部分(*c != 0)を評価し、結果を破棄してから、2番目の部分(c++)を評価し、それを結果として生成します。

インクリメントし続けたので、c条件は決してなりませんでした(書かれているように、それはポイントされた値をテストしておらず、ポインター自体をテストしていることに注意してください)。falsecNULL

あなたのループはループとしてよりきれいになりforます:

for (; *c != 0; ++c)
于 2011-04-17T03:05:34.950 に答える
3

whileループを次のように変更します。

while(*c != 0){
            if((*c >= 'a') && (*c <= 'z')){
                *c = *c - 32;                    
                std::cout << *c << std::endl;

            }
             c++; // Should be here
        }

これらを参照してください:

  1. あなたのコード

  2. 編集されたコード

Wikiから:

CおよびC++プログラミング言語では、コンマ演算子(トークンで表される)は、最初のオペランドを評価して結果を破棄し、次に2番目のオペランドを評価してこの値(および型)を返す2項演算子です。コンマ演算子は、C演算子の中で最も優先順位が低く、シーケンスポイントとして機能します。

于 2011-04-17T02:54:29.953 に答える