Создаю программу замены букв, запускается, но работает не верно! Подскажите пожалуйста, что я делаю не так? С++
Учу C++. Загорелся идеей написать программу, что бы русский переводила в транслит, ну или хотя бы просто переводила в верхний регистр весь текст, причем, что бы на каждую букву внимание обращала и переводила в транслит или (на данном этапе в верхний регистр) Ну просто такая тренировка для мозга х) и ничего у меня не вышло. Программа запускается. Работает. Но в вывод в консоли выдаёт дичь!
Подскажите, что я делаю не так?
Код, который я накатал:
//да прибудет со мной сила...
#include <iostream>
#include <string>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
char alphabetRus[33] = {'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я'};
char alphabetRusBig[33] = {'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я'};
string vvod; // для пользовательского ввода
int z; // для приёма локации буквы
cout << "\n\n\t\t\t\tЗдравствуйте, это чисто тестовая прога для замены букв."<<endl;
cout << "\nВведите пожалуйста фразу, буквы в которой так необходимо заменить.\n" << endl;
cout << "Ваша фраза:";
cin >> vvod;
cout << "\nобщее число символов входящих в ведённую Вами строку составляет: " << vvod.size() <<" символов\n\n"<< endl;
for (int i = 0; i < 33; ++i)
{
z = vvod.find(alphabetRus[i]);
vvod[z] = alphabetRusBig[i];
}
cout << "\nвведённая Вами фраза переведена в высокий регистр." << endl;
cout << "\nТеперь она выглядит вот так: " <<vvod<<"\n\n\n\n\n\n\n";
system ("pause");
return 0;
}
А начинаю вводить не одно слово, а именно фразу - он видит только первое слово, во всяком случае если верить функции .size() из ряда функций объекта string. я прям спецом вставил её в код ради этого (что бы отследить одну из проблем, но вот как решить не знаю).
Ответы (1 шт):
- Почему выдает каракули? Проблема локазализации
Подключите #include <windows.h> (если у вас ОС Windows, конечно) и в самом int main () пропишите
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
В моем случае это часто помогало решить проблему локализации. После этого ваша программа у меня заработала. Если не поможет: вот вопрос
- Ошибка в строчке
z = vvod.find(alphabetRus[i]);
Вы ищите какую либо букву в алфавите и сравниваете с тем, что ввел пользователь. Однако вы неучли случай, когда программа не находит в введенном слове буквы. функция find() в таком случае выдает string::npos (константа обозначающая что, искомая подстрока не найдена и равна она -1).
Пример:
Пользователь ввел: привет
Алгоритм в начале i = 0: vvod.find(alphabetRus[0]);, что тоже самое vvod.find('a');. Однако такой буквы нет и функция find() выдает -1. Но потом ваш алгоритм говорит следующее: vvod[-1] = alphabetRusBig[i];, но как обратится к -1 элементу? :)
Так что, чтобы миновать данную ошибку:
for (int i = 0; i < 33; ++i)
{
z = vvod.find(alphabetRus[i]);
if(z != string::npos)
vvod[z] = alphabetRusBig[i];
}
Итоговый код будет выглядеть так:
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
int main()
{
SetConsoleCP(1251); //локализация
SetConsoleOutputCP(1251);
char alphabetRus[33] = { 'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я' };
char alphabetRusBig[33] = { 'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я' };
string vvod; // для пользовательского ввода
int z; // для приёма локации буквы
cout << "\n\n\t\t\t\tЗдравствуйте, это чисто тестовая прога для замены букв." << endl;
cout << "\nВведите пожалуйста фразу, буквы в которой так необходимо заменить.\n" << endl;
cout << "Ваша фраза:";
cin >> vvod;
cout << "\nобщее число символов входящих в ведённую Вами строку составляет: " << vvod.size() << " символов\n\n" << endl;
for (int i = 0; i < 33; ++i)
{
z = vvod.find(alphabetRus[i]);
if (z != string::npos) //проверка на то что символ нашелся
vvod[z] = alphabetRusBig[i];
}
cout << "\nвведённая Вами фраза переведена в высокий регистр." << endl;
cout << "\nТеперь она выглядит вот так: " << vvod << "\n\n\n\n\n\n\n";
system("pause");
return 0;
}
Кстати еще как решение вашей задачи можно использовать функции toupper() - перевод в верхний регистр и tolower() - перевод в нижний регистр. Обе эти функции из библиотеки cctype. (#include <cctype>)