1

この小さなプログラムで何が間違っていますか。

私は c++ を学び始めたばかりですが、これは意味のない質問として受け入れることができます。Prata c++ 入門書を読んでいると、char 配列を取り、for ループで strcmp() を使用するコード例が得られました。これは、'?' で始まる ASCII コードを順次反復します。テスト char 変数 ==sa 別の char から値を設定するまで。

私は本を​​凌駕できると考えて、char配列を取り、forループを使用してテストchar配列を取り、2つの変数が等しくなるまで配列の各値を反復処理する同様のプログラムを作成しようとしました。

プログラムが単純に for ループをスキップして終了するように見える問題が発生していたため、for ループ内の各配列の最初の部分のみを取得するようにプログラムを単純化しました。

以下は、最初に prata コード スニペットであり、その後に私のコードが続きます。どんなフィードバックでも (虐待 >_< であっても) 役に立ちます。

#include <iostream>
#include <cstring>

int main() {
using namespace std;
char word[5] = "?ate";

for (char ch = ‘a’; strcmp(word, "mate"); ch++) {
cout << word << endl;
word[0] = ch;
}

cout << "After loop ends, word is " << word << endl;
return 0;
}

私のコード(不十分かもしれませんが、それを受け入れることができます)

#include <iostream>
#include <cstring>

int main() {
    using namespace std;
    char word[5] = "word";
    char test[5] = "????";
    int j = 0;
    int i = 0;

    cout << "word is " << word << "\nTest is " << test << endl;
    cout << word[0] << " " << test[0] << endl;
    for (char temp = '?'; word[0] == test[0] || temp == 'z'; temp++) {
        if ((word[i]) == (test[j])) {
            test[j] = temp;
            j++;
            temp = '?';
        }
        test[j] = temp++;
        cout << test << endl; //Added to see if the for loop runs through once, 
                                  //which is does not
    }
    return 0;
}
4

1 に答える 1

4

forここに示す条件のため、ループが開始されません。

word[0] == test[0] || temp == 'z'

最初のパスでは常に false を返します。and ( ) は( )tempに初期化されていないため、ループは開始されません。'?'word[0]wtest[0]?

また、そのように初期化tempした?ので、アスキー チャート?を見ると、 と 小文字の間にアルファ以外の文字がたくさんあることがわかりますz

さらに、forループ内でj( j++) をインクリメントしますが、 には決して触れませんi。インデックスとしてcharからwordを読み取っているので、最終的には になります。itest"wwww"

あなたは自分自身を混乱させているようですので...

あなたがやろうとしていることを分解しましょう:

文字列内のすべての文字を反復し、そのインデックスでアルファベットの各文字をチェックすると、2 つのループが発生します。

for(;;) {
    for(;;) {
    }
}

最初の (文字列内の各インデックスの反復処理は、インデックスが文字列の末尾に達したときに終了する必要があります (文字列リテラルは で終了します'\0'):

for(int i = 0; word[i] != '\0' && test[i] != '\0'; i++) {
    for(;;) {
    }
}

2 つ目は、アルファベット (char temp = 'a'および) の各文字を、および( )temp++の両方で指定されたインデックスに対してチェックします。それらが同等でない場合、正しい文字が見つかるまでインデックスの文字を設定します。すべてをまとめると、次のようになります。wordtestword[i] != test[i];testitemp

for(int i = 0; word[i] != '\0' && test[i] != '\0'; i++) {
    for(char temp = 'a'; word[i] != test[i]; temp++) {
        test[i] = temp;
    }
}

もちろん、ループやプログラミングの基本を自分で学ぼうとせず、結果だけを求めているのであれば、これは単純な呼び出しの非常に遠回りな方法にすぎません。

memcpy(temp, word, strlen(word));
于 2013-01-26T01:02:12.673 に答える