Я определенно думаю, что вы должны изучить корень проблемы. То есть ищите решение, которое позволит вам поддерживать символы, закодированные в Юникоде или для локали пользователя.
При этом ваша проблема в том, что вы имеете дело с многосимвольными строками. Есть std::wstring
, но я не уверен, что использовал бы это. Во-первых, широкие символы не предназначены для обработки кодировок переменной ширины. Эта дыра углубляется, поэтому я оставлю ее на этом.
Теперь, что касается остальной части вашего кода, он подвержен ошибкам, потому что вы смешиваете логику циклов с логикой перевода. Таким образом, могут возникнуть как минимум два вида ошибок: ошибки перевода и ошибки зацикливания. Используйте STL, это может вам сильно помочь с циклической частью.
Ниже приводится грубое решение для замены символов в строке.
main.cpp :
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include "translate_characters.h"
using namespace std;
int main()
{
string text;
cin.unsetf(ios::skipws);
transform(istream_iterator<char>(cin), istream_iterator<char>(),
inserter(text, text.end()), translate_characters());
cout << text << endl;
return 0;
}
translate_characters.h
#ifndef TRANSLATE_CHARACTERS_H
#define TRANSLATE_CHARACTERS_H
#include <functional>
#include <map>
class translate_characters : public std::unary_function<const char,char> {
public:
translate_characters();
char operator()(const char c);
private:
std::map<char, char> characters_map;
};
#endif // TRANSLATE_CHARACTERS_H
translate_characters.cpp
#include "translate_characters.h"
using namespace std;
translate_characters::translate_characters()
{
characters_map.insert(make_pair('e', 'a'));
}
char translate_characters::operator()(const char c)
{
map<char, char>::const_iterator translation_pos(characters_map.find(c));
if( translation_pos == characters_map.end() )
return c;
return translation_pos->second;
}