0

次のコードを使用して、C++ でファイルを暗号化および復号化しようとしています。

#include <iostream>

void crypt(char* pData, unsigned int lenData, const char* pKey, unsigned int lenKey)
{
    for (unsigned int i = 0; i < lenData; i++)
        pData[i] = pData[i] ^ pKey[i % lenKey];
}

int main()
{
    char* data = (char*)"any binary string here";
    crypt(data, 22, "key", 3);
    std::cout << data;
}

g++ (tdm-1) 4.5.1Windows 6.1 (Seven) で (MinGW) を使用してコンパイルしていますが、エラーや警告なしでコンパイルされます。実行しようとすると、「app.exe が動作を停止しました。問題の解決策があるかどうか、Windows がオンラインで確認できます」というウィンドウが表示されます。(そのようなもの、私のWindowsは英語ではありません)。何が悪いのかわかりません。

4

3 に答える 3

3

文字列定数を変更しようとしています。明らかな理由 (定数です) により、これは機能しません。代わりに、次のようにします。

int main()
{
    char data[] = "any binary string here";
    crypt(data, 22, "key", 3);
    std::cout << data;
}
于 2011-02-26T18:08:18.673 に答える
1

マイクはこの質問にうまく答えました。定数文字列リテラルは変更できません。DOSの時代はほぼ終わりました。適切な最新の製品レベルの C++ コンパイラは、適切なフラグを使用して警告を発行する必要があります。マイクの答えに少し追加するために、ここに定数文字列リテラルの良い説明があります - http://msdn.microsoft.com/en-us/library/69ze775t(v=vs.80).aspx

また、これを行うより良い方法は次のとおりです。

#include <iostream>

void crypt(char* pData, unsigned int lenData, const char* pKey, unsigned int lenKey)
{
    for (unsigned int i = 0; i < lenData; ++i)
        pData[i] ^= pKey[i % lenKey];
}

int main()
{
    char data[] = "any binary string here";
    const char key[] = "key";
    crypt (data, sizeof(data) - 1, key, sizeof (key) - 1);
    std::cout << data << std::endl;
}

ポストインクリメント演算子^=と sizeof 演算子に注意してください。単純な型の場合、コンパイラがこのマイクロ最適化を行いますが、良い習慣を身につけることは良いことです。複雑なイテレータがある場合、ポストインクリメントを使用すると、パフォーマンス クリティカル パスで問題が発生する可能性があります。また、文字列のサイズをハードコーディングするとエラーが発生しやすくなります。後で、あなたまたは他の誰かが文字列を変更し、その長さを変更するのを忘れる可能性があります。言うまでもなく、毎回文字数を数えなければなりません。

ハッピーコーディング!

于 2011-02-26T18:18:58.213 に答える
1

この行は間違っています:

char* data = (char*)"any binary string here";

まず、キャストを使用しないでください。次に、文字列リテラルは定数です。したがって、次のようになります。

const char* data = "any binary string here";

しかし、あなたはそれを上書きしたいと思っています。したがって、定数ではない文字列が必要です。このような:

char data[] = "any binary string here";
于 2011-02-26T18:08:03.950 に答える