Как удалить диакритические знаки и тильду в станд. C++:: строка

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

15
задан chema989 22 July 2016 в 21:59
поделиться

7 ответов

Во-первых, это - действительно плохая идея: you’re, искажающий somebody’s язык путем удаления букв. Хотя дополнительные точки в словах как “naГЇve” кажутся лишними людям, которые только говорят на английском языке, существуют буквально тысячи систем письменности в мире, в котором такие различия очень важны. Программное обеспечение Writing для вывода из строя someone’s речи помещает Вас прямо на неправильную сторону силы между использованием компьютеров как средства расширить область человеческого выражения по сравнению с инструментами притеснения.

, Какова причина you’re пытающийся сделать это? Что-то далее по линии дросселирует на диакритических знаках? Многие люди хотели бы помочь Вам решить это.

Тем не менее libicu может сделать это для Вас. Откройте , преобразовывают демонстрацию ; скопируйте и вставьте свой испанский текст в поле “Input”; войдите

NFD; [:M:] remove; NFC

, поскольку “Compound 1” и щелчок преобразовывают.

(Со справкой от слайда 9 из Unicode Преобразовывает в ICU. Двигает шоу 29-30, как использовать API.)

17
ответ дан 1 December 2019 в 00:45
поделиться

Я определенно думаю, что необходимо изучить корень проблемы. Таким образом, ищите решение, которое позволит, Вы для поддержки символов закодировали в Unicode или для локали пользователя.

Однако Ваша проблема состоит в том, что Вы имеете дело с мультисимвольными строками. Существует 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;
}
2
ответ дан 1 December 2019 в 00:45
поделиться

Я не соглашаюсь с в настоящее время "утверждаемым" ответом. Вопрос имеет смысл при индексации текста. Как поиск без учета регистра, не чувствительный к диакритическим знакам поиск является хорошей идеей. "naГЇve" соответствует соответствиям "NaГЇve" "наивные" соответствия "NAД°VE" (Вы знаете, что верхний регистр я - Д ° на турецком языке? Вот почему Вы игнорируете диакритические знаки)

Теперь, лучшему алгоритму подсказывают в утвержденном ответе: Используйте NKD (разложение), чтобы разложить акцентируемые буквы на основную букву и отдельный диакритический знак, и затем удалить все диакритические знаки.

существует мало точки в пересоставе впоследствии, все же. Вы удалили большинство последовательностей, которые изменятся, и другие, во всех отношениях, идентичны так или иначе. КАКОВО различие между Г ¦ в NKC и Г ¦ в NKD?

24
ответ дан 1 December 2019 в 00:45
поделиться

Вы могли бы хотеть проверить повышение ( http://www.boost.org/ ) библиотека.

Это имеет regexp библиотеку, которой Вы могли пользоваться. Кроме того, это имеет определенную библиотеку, которая имеет некоторые функции для обработки строк ( ссылка ) включая замену.

0
ответ дан 1 December 2019 в 00:45
поделиться

Попытка с помощью станд.:: wstring вместо станд.:: строка. UTF-16 должен работать (в противоположность ASCII).

0
ответ дан 1 December 2019 в 00:45
поделиться

Я не мог связать библиотеки ICU, но я все еще думаю, что это - лучшее решение. Поскольку мне нужна эта программа, чтобы быть функциональным как можно скорее, я сделал немного программы (что я должен улучшиться), и я собираюсь использовать это. Спасибо всем за для предложений и ответов.

Вот код, который я собираюсь использовать:

for (it= dictionary.begin(); it != dictionary.end(); it++)
{
    strMine=(it->first);
    found=toReplace.find(strMine);
    while (found != std::string::npos)
    {
        strAux=(it->second);
        toReplace.erase(found,2);
        toReplace.insert(found,strAux);
        found=toReplace.find(strMine,found+1);
    }
} 

я изменю его в следующий раз, когда я должен возвратить свою программу для исправления (приблизительно через 6 недель).

0
ответ дан 1 December 2019 в 00:45
поделиться

Если Вы можете (при выполнении Unix) я предлагаю использовать tr средство для этого: это производится по заказу с этой целью. Помните, никакой код == никакой содержащий ошибки код. :-)

Редактирование: Извините, Вы правы, tr, кажется, не работает. Как насчет sed? Это - довольно глупый сценарий, который я записал, но это работает на меня.

#!/bin/sed -f
s/á/a/g;
s/é/e/g;
s/í/i/g;
s/ó/o/g;
s/ú/u/g;
s/ñ/n/g;
0
ответ дан 1 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: