Как «перевести» строку слов, используя карту? Поиск по карте ключей и отображение значения - PullRequest
0 голосов
/ 02 мая 2018

У меня есть карта, которая содержит испанские слова в качестве ключей и то же слово на английском языке, что и значения для каждого ключа. Я хочу перевести строку слов с испанского на английский. Я предполагаю, что мне нужно разобрать строку, чтобы отделить слова. Я не знаю, как искать по ключам карты и затем отображать значение.

    map<string, string> trans;
    tran["rearrancar"] = "reboot";
    tran["pantalla"] = "screen";
    tran["texto"] = "text";
    tran["virus"] = "virus";
    tran["tinta"] = "ink";
    tran["mitad"] = "half";
    tran["interno"] = "internal";
    tran["memoria"] = "memory";
    tran["papel"] = "paper";
    tran["energia"] = "power";
    tran["fallo"] = "bug";
    tran["pelo"] = "hair";
    tran["el"] = "the";
    tran["dos"] = "two";
    tran["todas"] = "all";
    tran["en"] = "in";
    tran["de"] = "of";
    tran["los"] = "the";
    tran["comprar"] = "buy";
    tran["tarde"] = "afternoon";
    tran["quieres"] = "want";
    tran["muchachos"] = "boys";
    tran["tienen"] = "have";
    tran["ordenador"] = "computer";
    tran["con"] = "with";
    tran["antes"] = "before";
    tran["vacio"] = "empty";
    tran["tu"] = "you";
    tran["hambre"] = "hunger";
    tran["contaminado"] = "corrupt";
    tran["a"] = "to";
    tran["una"] = "a";
    tran["la"] = "the";
    tran["cafe"] = "brown";
    tran["su"] = "your";
    tran["es"] = "is";
    tran["quiero"] = "want";
    tran["vamos"] = "go";
    tran["mi"] = "my";
    tran["barco"] = "ship";
    tran["nosotros"] = "we";
    tran["casa"] = "house";
    tran["yo"] = "I";
    tran["borrar"] = "delete";
    tran["necesita"] = "necessary";
    tran["despues"] = "after";

    string paragraph ("yo quiero una ordenador virus
    todas de los muchachos tienen interno memoria
    mi pelo es cafe
    tu quieres tinta con su papel
    rearrancar el ordenador a vacio el pantalla");

Было бы лучше хранить каждое слово в массиве строк?

Редактировать: теперь я могу найти на карте слово для перевода, но оно падает после 4-го переведенного слова. Я уверен, что это как-то связано с параметрами моего цикла for, но я не знаю, что в него вставить.

    stringstream ss(paragraph);
    string word = "";
    for (int i = 0; i < paragraph.length(); i++) {
        getline(ss, word, ' ');
        cout << tran.find(word)->second << " ";
    }

Абзац - строка, содержащая переводимый абзац. Tran - это название моей карты, содержащей испанские ключи и английские значения.

1 Ответ

0 голосов
/ 02 мая 2018

Ваш цикл зацикливается paragraph.length() раз (количество символов в paragraph), но каждый раз, когда вы извлекаете слово . Видите проблему?

Вместо этого используйте while (getline(ss, word, ' ')). getline вернет поток, который ему был передан, и преобразование его в bool эквивалентно !ss.fail(). Это в основном циклы, пока извлечение не завершится неудачно (достиг конца потока и ничего не извлекло).

Вы также никогда не проверяли, не удастся ли найти слово на карте, и поэтому у вас есть возможность попытаться разыменовать tran.end().

Некоторые другие незначительные проблемы с вашим кодом включают using namespace std, который может считаться плохой практикой , и некоторые опечатки, связанные с разницей между tran и trans.

Фиксированный код:

#include <iostream>
#include <map>
#include <string>
#include <sstream>

int main()
{
    std::map<std::string, std::string> tran;
    tran["rearrancar"] = "reboot";
    tran["pantalla"] = "screen";
    tran["texto"] = "text";
    tran["virus"] = "virus";
    tran["tinta"] = "ink";
    tran["mitad"] = "half";
    tran["interno"] = "internal";
    tran["memoria"] = "memory";
    tran["papel"] = "paper";
    tran["energia"] = "power";
    tran["fallo"] = "bug";
    tran["pelo"] = "hair";
    tran["el"] = "the";
    tran["dos"] = "two";
    tran["todas"] = "all";
    tran["en"] = "in";
    tran["de"] = "of";
    tran["los"] = "the";
    tran["comprar"] = "buy";
    tran["tarde"] = "afternoon";
    tran["quieres"] = "want";
    tran["muchachos"] = "boys";
    tran["tienen"] = "have";
    tran["ordenador"] = "computer";
    tran["con"] = "with";
    tran["antes"] = "before";
    tran["vacio"] = "empty";
    tran["tu"] = "you";
    tran["hambre"] = "hunger";
    tran["contaminado"] = "corrupt";
    tran["a"] = "to";
    tran["una"] = "a";
    tran["la"] = "the";
    tran["cafe"] = "brown";
    tran["su"] = "your";
    tran["es"] = "is";
    tran["quiero"] = "want";
    tran["vamos"] = "go";
    tran["mi"] = "my";
    tran["barco"] = "ship";
    tran["nosotros"] = "we";
    tran["casa"] = "house";
    tran["yo"] = "I";
    tran["borrar"] = "delete";
    tran["necesita"] = "necessary";
    tran["despues"] = "after";

    std::string paragraph(
            "yo quiero una ordenador virusu todas de los muchachos tienen");
    std::stringstream ss(paragraph);
    std::string word;
    while (std::getline(ss, word, ' '))
    {
        auto findResult = (tran.find(word));
        std::cout
                << (findResult != tran.end() ?
                        findResult->second : "[translation not found]") << " ";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...