1

だから私はアルゴリズムの理解に取り組んでいて、インターネットでそのアルゴリズムの C++ コードを見つけましたが、問題は、Java は知っていますが、C++ にはあまり慣れていないため、理解するのに苦労していることです。特にこの部分:

int m, i, j, len;
char temp[50];
char stuff[100][100];


while(scanf("%d",&m)!=EOF)
{
    while(m--)
    {
        scanf("%s",temp);

        len = strlen(temp);
        for(i=0;i<=len;i++)
            for(j=0;j<=len;j++)
                memset(stuff[i][j],0,sizeof(char)*4);

    }
}

わかりましたので、ここで私が理解していない部分について考えています。私が正しい軌道に乗っているかどうか誰かが教えてくれたら、とても感謝しています。

while(scanf("%d",&m)!=EOF)

この部分については、入力ファイルなどはなく、m は初期化されていないためです。EOF charがコンソールに表示されるまで、intまたはdoubleのユーザー入力を受け入れることを意味すると考えています。その入力は m として保存されます。私はwhileループについて混乱しています。何か進行中?m は 1 つの int にすぎないので、よくわかりません。

while(m--)

for(i = m; i>=0; i--) と同等ですか?

scanf("%s",temp);

    len = strlen(temp);
    for(i=0;i<=len;i++)
        for(j=0;j<=len;j++)
            memset(stuff[i][j],0,sizeof(char)*4);

したがって、m がデクリメントしている場合、コンソールからユーザー入力を文字列の形式で取得しますが、実際には文字であり、各文字を temp[] の次のインデックスに保存しますか? len は、実際に初期化されたその配列内の文字数ですか? これは len == m ということですか? そして、memset は各 3 次元配列の 4 つのインデックスを null に設定するだけですか?

ここで期待しているのは、ユーザーが n 文字のシーケンスを入力して一時的に保存し、シーケンス内の文字数に応じて、すべてゼロで埋められた stuff[n][n][4] の 3D 配列を準備することです。 . 基本的に文字列を取り込むだけでは、 while ステートメントが過剰に見えるだけです。

どんな助けでも素晴らしいでしょう。私はこれまで C++ で何もしたことがありませんでしたが、この最後の部分を除いてすべてを理解しました。長くなって申し訳ありませんが、私が考えていることを示そうとしました。

4

3 に答える 3

2

Java と C の構文はそれほど離れていないため、Java を知っている場合はこれを読むのに苦労するはずです。while ループ、for ループ、それぞれに対応するコード ブロック、変数のプリ/ポスト インクリメント/デクリメントはほとんど同じです。

scanf()複雑な獣ですが、それをどのように使用しているかの要点があります...標準入力パスから読み取り、あなたの場合、整数を読み取ります(%d は int を表し、Google の "man scant" はフルを表します)詳細)、 に配置しmます。この入力を読み取るループがあり、 の新しい値に基づいてコード ブロックを実行しますm

このwhile (m--)ブロックは、あなたが提案したforループと同じで、Javaでも同じように機能します。

scanf("%s")単なる文字ではなく、文字列を読み取ります...文字列は NULL で終了しますが、入力がバッファーのサイズを超えないという保証はありません (それ以上のことをしなければ) ( temp)。

strlen()文字列の長さを返します (NULL 終端は含みません)。

memset(buffer, value, length)から始まる合計バイト数valueをメモリに書き込みます。ドキュメント用の Google "man memset"。bufferlength

于 2013-11-14T21:57:01.670 に答える
0
while(scanf("%d",&m)!=EOF)

m入力がなくなるまで、整数を入力として に読み込みます。

while(m--)

はい、とまったく同じfor(; m>=0; m--)です。

したがって、m がデクリメントしている場合、コンソールからユーザー入力を文字列の形式で取得しますが、実際には文字であり、各文字を temp[] の次のインデックスに保存しますか? len は、実際に初期化されたその配列内の文字数ですか? これは len == m ということですか? そして、memset は各 3 次元配列の 4 つのインデックスを null に設定するだけですか?

tempこのコードは、 の配列である にテキストを読み込みますcharstrlen(temp)のテキストの長さを決定しますtemp(ゼロが表示されるまで順方向にカウントされますchar。これは、C でテキスト文字列が終了する方法です)。いいえ、len != m. そして、あなたは の役割について正しいですmemset

ここで期待しているのは、ユーザーが n 文字のシーケンスを入力して一時的に保存し、シーケンス内の文字数に応じて、すべてゼロで埋められた stuff[n][n][4] の 3D 配列を準備することです。 .

はい、これはまさに何が起こるかです。

于 2013-11-14T21:57:32.530 に答える
0

まず、scanfprintfは主に C で使用されるコマンドですが、C++ でも使用できます。

に関してはwhile(m--)

と同じですfor (int i = m; i > 0; i--)

于 2013-11-14T21:56:52.450 に答える