Второй день пытаюсь сделать шифрование Xor'ом, но все никак не получается. Вот мой код. Что у меня не так?
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int key;
char text[100];
string res;
cout << "Введите текст: " << endl; // ввожу текст
cin >> text;
cout << "Введите ключ: " << endl;
cin >> key; // ввожу ключ
for (int i = 0; i < strlen(text); i++) { // подгоняю размер
res[i] = text[i] ^ key; //само шифрование
}
cout << "Зашифрованный текст: " << res << endl;
return 0;
}
Как уже сказали, у тебя строка res
нулевой длины, т.е. строка есть, а память под симполы не выделено. Прежде чем обратиться в i_тому символу, надо чтоб этот символ был. Т.е. надо проинициализировать строку res
, например, так:
....
char text[100];
cout << "Введите текст: " << endl; // ввожу текст
cin >> text;
string res(test);
...
Теперь у тебя строка res
эта полная копия text
. Но тут правильно заметили, если тебе не нужно хранить оригинальную строку, то можешь прямое ее и модифицировать вот так:
...
for (int i = 0; i < strlen(text); i++) { // подгоняю размер
text[i] = text[i] ^ key; //само шифрование
}
cout << "Зашифрованный текст: " << text << endl;
...
Но и тут есть подводные камни. Если ты введешь ключ который совпадает с ASCII кодом символа из строки, то после операции XOR на месте это символа окажется \0
, что является признаком конца троки. Тогда std::cout распечатает зашифрованную строку только до этого символа и у тебя будет навсегда потерям оригинальный размер строки.
std::string key;
std::string str;
std::cout << "Введите текст: " << std::endl;
std::getline(std::cin, str); // вводим текст. Память выделяется автоматически
std::cout << "Введите ключ: " << std::endl;
std::getline(std::cin, key); // вводим ключ
int keyIdx = 0; // текущий индекс байта ключа
for (int i = 0; i < str.size(); i++) {
str[i] = str[i] ^ key[keyIdx++]; // шифруем строку и смещаем индекс ключа
if (keyIdx == key.size()) // если достигли конца ключа - начинаем сначала
keyIdx = 0;
}
std::cout << "Зашифрованный текст: " << str << std::endl;
Тип std::string может содержать \0 внутри строки
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Ваши условия не покрывают случай, когда i или j равно n, а стало быть в ячейках с этими индексами остаются неинициализированные данныеПросто...
Можно ли QLineEdit сделать многострочным? Я имею ввиду чтобы там оставалась одна строка, нельзя было enter нажать, просто чтобы буквы отображались...
Помогите исправить код надо вместо 3 * 3 * 3 чтобы было сразу 3^3
Столкнулся с проблемойНужно вставить в таблицу, в луа C-функцию, которая должна обращаться к НЕ статичному полу (экземпляру класса)