Ошибка при запуске приложения g ++.(шифрование строки) - PullRequest
0 голосов
/ 26 февраля 2011

Я пытаюсь зашифровать и расшифровать файлы с помощью 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.1 (MinGW) в Windows 6.1 (Seven), он компилируется без ошибок и предупреждений. Когда я пытаюсь запустить, он показывает окно с «app.exe перестала работать. Windows может проверить онлайн, если есть какое-то решение проблемы». (что-то подобное, моя Windows не на английском языке). Я понятия не имею, что не так.

Ответы [ 3 ]

3 голосов
/ 26 февраля 2011

Вы пытаетесь изменить строковую константу. По понятным причинам (это постоянная ), это не будет работать. Вместо этого сделайте это:

int main()
{
    char data[] = "any binary string here";
    crypt(data, 22, "key", 3);
    std::cout << data;
}
1 голос
/ 26 февраля 2011

Майк хорошо ответил на этот вопрос. Вы не можете изменять константы строковых литералов. Время 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. Для простых типов компилятор сделает эту микрооптимизацию за вас, но разработка хорошей привычки - это хорошо. Если у вас есть сложный итератор, использование постинкремента может нанести вред критическим путям производительности. Кроме того, жесткий размер строк подвержен ошибкам. Позже вы или кто-то другой можете изменить строку и забыть изменить ее длину. Не говоря уже о том, что каждый раз вам нужно идти и считать количество символов.

Удачного кодирования!

1 голос
/ 26 февраля 2011

Эта строка неверна:

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

Во-первых, вы не должны использовать приведение. Далее строковый литерал является константой. Так и должно быть:

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

Но вы хотите перезаписать это. Поэтому вам нужна строка, которая не является константой. Как это:

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