运行g ++ app时出错。 (字符串加密)

时间:2011-02-26 18:06:00

标签: c++ windows g++ constants string-constant

我正在尝试用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;
}

我在Windows 6.1(Seven)上使用g++ (tdm-1) 4.5.1(MinGW)进行编译,它编译时没有错误或警告。当我尝试运行时,它会显示一个“app.exe停止工作的窗口。如果有问题的解决方案,Windows可以在线检查。” (有些事情,我的Windows不是英文)。我不知道出了什么问题。

3 个答案:

答案 0 :(得分:3)

您正在尝试修改字符串常量。出于显而易见的原因(它是常量),这将不起作用。相反,这样做:

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

答案 1 :(得分:1)

这一行错了:

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

首先,你不应该使用演员表。接下来,字符串文字是常量。所以它应该是:

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

但是你想要覆盖它。所以你需要一个不是常量的字符串。像这样:

char data[] = "any binary string here";

答案 2 :(得分:1)

迈克很好地回答了这个问题。您无法修改常量字符串文字。 DOS的时间几乎结束了。适当的最新生产级别C ++编译器应该发出带有适当标志的警告。只是为Mike的答案添加一点,这里是对常量字符串文字的一个很好的解释 - 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运算符。对于简单类型,编译器会为您进行微优化,但养成良好的习惯是好的。如果您有一个复杂的迭代器,使用后增量会对性能关键路径造成伤害。此外,字符串的硬编码大小容易出错。稍后您或其他人可以更改字符串并忘记更改其长度。更不用说每次你必须去计算字符数。

快乐的编码!