Ошибка при запуске приложения g++. (шифрование строки)
Я пытаюсь зашифровать и расшифровать файлы с помощью 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 ответа
Эта строка неверна:
char* data = (char*)"any binary string here";
Во-первых, вы не должны использовать актерский состав. Далее строковый литерал является константой. Так и должно быть:
const char* data = "any binary string here";
Но вы хотите перезаписать это. Так что вам нужна строка, которая не является константой. Как это:
char data[] = "any binary string here";
Вы пытаетесь изменить строковую константу. По понятным причинам (это постоянно) это не сработает. Вместо этого сделайте это:
int main()
{
char data[] = "any binary string here";
crypt(data, 22, "key", 3);
std::cout << data;
}
Майк хорошо ответил на этот вопрос. Вы не можете изменять константы строковых литералов. Время DOS почти закончилось. Надлежащий современный компилятор C++ производственного уровня должен был выдавать предупреждение с соответствующими флагами. Просто чтобы добавить немного в ответ Майка, вот хорошее объяснение константных строковых литералов - http://msdn.microsoft.com/en-us/library/69ze775t%28v=vs.80%29.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;
}
Примечание пост-инкрементный оператор, ^=
и размер операторов. Для простых типов компилятор сделает эту микрооптимизацию за вас, но разработка хорошей привычки - это хорошо. Если у вас есть сложный итератор, использование постинкремента может повредить вам на критических для производительности путях. Кроме того, жесткий размер строк подвержен ошибкам. Позже вы или кто-то другой можете изменить строку и забыть изменить ее длину. Не говоря уже о том, что каждый раз вам нужно идти и считать количество символов.
Удачного кодирования!