-1

問題があります。文字の配列を作成する必要があります。最初は 1 文字だけで、すべての文字がなくなったら 2 桁の文字を作成し、文字がなくなったら 3 桁の文字を作成します。そのことについて:

char myChar = malloc(8);

for (int i = 0; i < 25; i++)
{
mychar[i] = i + 'a';
}

1文字の単語がなくなるとどこに行けばいいのかわからない。ネストされた for ループ? 文字を追加するには?strcat() で?

編集:私の質問が明確でない場合は申し訳ありません。基本的には強引なハッシュクラッカーを作る課題です。私は一部が機能していて、文字列を比較していますが、唯一の問題は、シンボルを生成することです。これがどのように機能するか - 単語を作成し、has 関数に送信し、結果をターゲット ハッシュでチェックします。それらが同じであれば、ほら。ここでは、1文字から始まる文字の配列を作成しようとしています。だから私は「a」を作り、それをチェックし、役に立たない場合は「b」に変更し、「z」まで続きます。「z」に到達したら、「aa」、「ab」、「ac」、「zz」の 2 文字で新たに開始する必要があります。これがなくなったら、「aaa」、次に「aab」など、最大8桁で始めたいと思います。膨大な時間がかかることはわかっています。しかし、私が直面している問題は、文字の連結です。ループをどのように記述すれば、最初のラウンドではシンボルが 1 つだけになり、2 番目のラウンドではシンボルが 2 つというようになります。これで少し説明がついたことを願っています。

4

1 に答える 1

1

次のコードでは、ネストされたループを使用しています。外側のループは無限です。必要な長さのループに置き換えます。内側のループは、文字列を次の文字列に変更します。「aa」から「ba」、「ba」から「ca」、...、「zz」から「aaa」などです。使用する代わりに、文字列内の個々の文字を変更しますstrcat.

出力が少し後方に見えることに注意してください。すべての推測をチェックする限り、すべての推測をどの順序でチェックするかはそれほど重要ではないため、それほど悪くはないと思います。

char str[100] = ""; // initialize all characters to '\0'
char min = 'a';
char max = 'z';
for (;;)
{
    int i;
    int increase_length = 1; // a flag to detect transitions like "zzz" => "aaaa"
    for (i = 0; str[i] != '\0'; ++i)
    {
        if (str[i]++ == max) // change to next character and check whether it was 'z'
        {
            str[i] = min;
        }
        else
        {
            increase_length = 0;
            break;
        }
    }
    if (increase_length)
        str[i] = min;
    puts(str);
}
于 2012-11-20T19:07:38.783 に答える