транслит и c++

Savchik Blazer

Но я, мечту свою лелея...
Автор темы
Проверенный
671
293
имеется вот такой код

C++:
void Transliterate(char* str, char* newStr)
{
    for (; *str != 0; str++)
    {
        switch (str[0])
        {
        case 'a': strcat(&newStr[0], "а"); break;
        case 'b': strcat(&newStr[0], "б"); break;
        case 'v': strcat(&newStr[0], "в"); break;
        case 'g': strcat(&newStr[0], "г"); break;
        case 'd': strcat(&newStr[0], "д"); break;
        case 'e': strcat(&newStr[0], "е"); break;
        case 'yo': strcat(&newStr[0], "ё"); break;
        case 'zh': strcat(&newStr[0], "ж"); break;
        case 'z': strcat(&newStr[0], "з"); break;
        case 'i': strcat(&newStr[0], "и"); break;
        case 'j': strcat(&newStr[0], "дж"); break;
        case 'k': strcat(&newStr[0], "к"); break;
        case 'l': strcat(&newStr[0], "л"); break;
        case 'm': strcat(&newStr[0], "м"); break;
        case 'n': strcat(&newStr[0], "н"); break;
        case 'o': strcat(&newStr[0], "о"); break;
        case 'p': strcat(&newStr[0], "п"); break;
        case 'r': strcat(&newStr[0], "р"); break;
        case 's': strcat(&newStr[0], "с"); break;
        case 't': strcat(&newStr[0], "т"); break;
        case 'u': strcat(&newStr[0], "у"); break;
        case 'f': strcat(&newStr[0], "ф"); break;
        case 'h': strcat(&newStr[0], "х"); break;
        case 'cz': strcat(&newStr[0], "ц"); break;
        case 'ch': strcat(&newStr[0], "ч"); break;
        case 'sh': strcat(&newStr[0], "ш"); break;
        case 'shh': strcat(&newStr[0], "щ"); break;
        case '``': strcat(&newStr[0], "Ъ"); break;
        case '`': strcat(&newStr[0], "ь"); break;
        case 'y': strcat(&newStr[0], "ай"); break;
        case 'e`': strcat(&newStr[0], "Э"); break;
        case 'yu': strcat(&newStr[0], "ю"); break;
        case 'ya': strcat(&newStr[0], "я"); break;
        case 'x': strcat(&newStr[0], "кс"); break;
        case 'w': strcat(&newStr[0], "ви"); break;
        case 'c': strcat(&newStr[0], "к"); break;
        case 'q': strcat(&newStr[0], "к"); break;
        //заглавные

        case 'A': strcat(&newStr[0], "А"); break;
        case 'B': strcat(&newStr[0], "Б"); break;
        case 'V': strcat(&newStr[0], "В"); break;
        case 'G': strcat(&newStr[0], "Г"); break;
        case 'D': strcat(&newStr[0], "Д"); break;
        case 'E': strcat(&newStr[0], "Е"); break;
        case 'YO': strcat(&newStr[0], "Ё"); break;
        case 'ZH': strcat(&newStr[0], "Ж"); break;
        case 'Z': strcat(&newStr[0], "З"); break;
        case 'I': strcat(&newStr[0], "И"); break;
        case 'J': strcat(&newStr[0], "Дж"); break;
        case 'K': strcat(&newStr[0], "К"); break;
        case 'L': strcat(&newStr[0], "Л"); break;
        case 'M': strcat(&newStr[0], "М"); break;
        case 'N': strcat(&newStr[0], "Н"); break;
        case 'O': strcat(&newStr[0], "О"); break;
        case 'P': strcat(&newStr[0], "П"); break;
        case 'R': strcat(&newStr[0], "Р"); break;
        case 'S': strcat(&newStr[0], "С"); break;
        case 'T': strcat(&newStr[0], "Т"); break;
        case 'U': strcat(&newStr[0], "У"); break;
        case 'F': strcat(&newStr[0], "Ф"); break;
        case 'H': strcat(&newStr[0], "Х"); break;
        case 'CZ': strcat(&newStr[0], "Ц"); break;
        case 'CH': strcat(&newStr[0], "Ч"); break;
        case 'SH': strcat(&newStr[0], "Ш"); break;
        case 'SHH': strcat(&newStr[0], "Щ"); break;
        case 'Y': strcat(&newStr[0], "Й"); break;
        case 'E`': strcat(&newStr[0], "Э"); break;
        case 'YU': strcat(&newStr[0], "Ю"); break;
        case 'YA': strcat(&newStr[0], "Я"); break;
        case 'X': strcat(&newStr[0], "КС"); break;
        case 'W': strcat(&newStr[0], "ВИ"); break;
        case 'C': strcat(&newStr[0], "К"); break;
        case 'Q': strcat(&newStr[0], "К"); break;

        default: { char Temp[2] = { str[0], 0 }; strcat(&newStr[0], &Temp[0]); }
        }
    }
}

C++:
char* x = "chapo";
        char y[100] = { 0 };
        Transliterate(x, &y[0]);
SF->logConsole("%s", y)


выдает не "чапо", а "схапо"

можно ли как-то эту проблему решить?
 
Решение
Написать правильный код) Ты работаешь с байтами же и хочешь сравнить двухбайтное значение которое идет в case с однобайтным которое идет свитч. Как вариант, можно сделать вектор пару(std::pair) с где в первом елементе будут искомые символы, а во втором которые будут заменены на первые. Проходится через фор, ищем через std::string::find и заменяем через std::string::replace. Код на полную правильную работоспособность не претендует.
C++:
#include <iostream>
#include <string>
#include <utility>
#include <vector>

int main(){
    std::vector <std::pair<std::string, std::string>> vec = {
        {"ch", "ч"},
        {"a", "а"},
        {"p", "п"},
        {"o", "о"},
    };
    std::string text = "chapo";
    for (auto it : vec) {...

Dark_Knight

Me, me and me.
Друг
4,062
2,078
Написать правильный код) Ты работаешь с байтами же и хочешь сравнить двухбайтное значение которое идет в case с однобайтным которое идет свитч. Как вариант, можно сделать вектор пару(std::pair) с где в первом елементе будут искомые символы, а во втором которые будут заменены на первые. Проходится через фор, ищем через std::string::find и заменяем через std::string::replace. Код на полную правильную работоспособность не претендует.
C++:
#include <iostream>
#include <string>
#include <utility>
#include <vector>

int main(){
    std::vector <std::pair<std::string, std::string>> vec = {
        {"ch", "ч"},
        {"a", "а"},
        {"p", "п"},
        {"o", "о"},
    };
    std::string text = "chapo";
    for (auto it : vec) {
        size_t f = std::string::npos;
        do {
            size_t f = text.find(it.first);
            if (f != std::string::npos)
                text = text.replace(f, it.first.length(), it.second);
        } while (f != std::string::npos);
    }
    std::cout << text << std::endl;
}
 
  • Нравится
Реакции: Savchik Blazer