Последний символ строки игнорирует условие его проверки
Необходимо ограничить ввод в строку таким образом, чтобы в строке были только символы 'G', 'C', 'T', 'A' и длина строки была кратна трем. При проверке введеных символов появилась проблема. При вводе 'CATCGTAATGACGGCCTТ' и подобных наборов символов, условие:
if (d[i] == d0[j])
{
e++;
break;
}
по какой-то причине, обходит стороной последний символ 'T', т.е не выполняет условие, когда 'T' = 'T', хотя программа его видит и считывает в соответствующую переменную.
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int x = 0, size = 0, e, k3 = 0, k, u = 0;
string d, d1, d0 = "GCTA";
do
{
cout << "Введите d: " << endl;
cin >> d;
e = 0;
k3 = d.size() % 3;
for (int i = 0; i < d.size(); i++)
{
for (int j = 0; j < d0.size(); j++)
{
if (d[i] == d0[j])
{
e++;
break;
}
}
}
if (e != d.size() || (k3 != 0))
{
cout << "Повторите ввод" << endl;
}
} while (e != d.size() || (k3 != 0));
Прошу помочь решить и объяснить данную проблему.
Ответы (2 шт):
Ошибки в коде нет, у вас ошибка во входной строчке - последняя T не латинская, а из кириллицы. Замените её на букву T из латиницы и у вас всё заработает.
Из вашего вопроса не понятно что является ограничением. Это неудачное завершение или обработка исключительной ситуации или установка флага или еще что то?.. Но то, что вы пытаетесь делать, можно сделать много проще и разными способами, но не таким многословным способом, как у вас. Пример кода:
const char d[] = "GCTA";
std::string s;
/*пока ввод строки корретен
и длина строки не кратна трем
и в строке есть какой нибудь другой символ кроме заданных
выводится сообщение об ошибке*/
while (cin >> s && (s.size() % 3 ||
s.find_first_not_of(d) != s.npos))
{
std::cerr << "error...try again\n";
}
по моему отражает то, что вы хотели делать.