Проверка на пустой символ в аффинном шифре
Реализую аффинный шифр. Нужно, чтобы слова можно было вводить только без пробела. Но не получается реализовать корректную проверку на пустой символ. Подскажите, пожалуйста, как можно сделать так, чтобы если в тексте был пробел хоть один, то программа бы не срабатывала.
#include <iostream>
#include <conio.h>
#include <string>
#include <fstream>
using namespace std;
int a;
int b;
string encryption(string m) {
string text = "";
for (int i = 0; i < m.length(); i++) {
if (m[i] != ' ') {
text = text + (char)((((a * (m[i] - 'A')) + b) % 26) + 'A');
}
else {
text += m[i];
}
}
return text;
}
string decryption(string c) {
string text = "";
int a_invers = 0;
int flag = 0;
for (int i = 0; i < 26; i++) {
flag = (a * i) % 26;
if (flag == 1) {
a_invers = i;
}
}
for (int i = 0; i < c.length(); i++) {
if (c[i] != ' ') {
text = text + (char)(((a_invers * ((c[i] + 'A' - b)) % 26)) + 'A');
}
else {
text += c[i];
}
}
return text;
}
int main() {
setlocale(LC_ALL, "Russian");
cout << "Введите число a: ";
cin >> a;
cout << "Введите число b: ";
cin >> b;
if ((a == 0 || a == 2 || a == 4 || a == 6 || a == 8 || a == 10 || a == 12 || a == 13 || a == 14 || a == 16 || a == 18 || a == 20 || a == 22 || a == 24) || (a >= 26)) {
cout << "Число a некорректно! Возможные значения: 1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23 и 25" << endl;
_getch();
return 0;
}
string msg;
cout << "Введите сообщение заглавными буквами: ";
cin >> msg;
/*for (int i = 0; i < msg.length(); i++) {
if (msg[i] != ' ') {
cout << "Вы ввели пробелы, повторите ввод текста без пробелов!" << endl;
_getch();
return 0;
}
}*/
string c = encryption(msg);
cout << "Зашифрованное сообщение: " << c << endl;
cout << "Расшифрованное сообщение: " << decryption(c);
ofstream out;
out.open("d:\\1\\shifr.txt");
if (out.is_open())
{
out << "Зашифрованное сообщение: " << c << endl;
out << "Расшифрованное сообщение: " << decryption(c) << endl;
}
_getch();
return 0;
}
Ответы (1 шт):
Во-первых, как вам уже заметили, вы не считываете текст целиком, а только первую последовательность символов до пробельного знака (в том числе таба и \n). Так что для начала вам нужно изменить код считывания данных на что-то вроде:
std::getline(std::cin, msg);
Но я больше предпочитаю подобный вариант:
std::copy(std::istreambuf_iterator<char>{std::cin}, std::istreambuf_iterator<char>{}, std::back_inserter(msg));
Во-вторых, проверку на наличие пробельных символов легко реализовать с помощью регулярных выражений. Это будет что-то вроде:
std::regex checkRegex{"^[^\\s]+$"};
if (std::regex_match(msg.begin(), msg.end(), checkRegex) == false) {
std::cerr << "message is invalid" << std::endl;
return EXIT_FAILURE;
}
Хотя я бы лучше выбрал другую регулярку, вроде ^[A-Z]+$