Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/41: Рейтинг темы: голосов - 41, средняя оценка - 4.98
1 / 1 / 0
Регистрация: 31.01.2020
Сообщений: 148

Как удалить символ '—' из std::string, используя std::string::erase?

22.06.2020, 11:05. Показов 8623. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
        for(auto it = words[i].begin(); it!=words[i].end();)
        {
            if( *it == '—' )
            {
                it = words[i].erase(it);
            }
            else
            {
                it++;
            }
        }
Я удлаяю тире из строк в векторе, как я понимаю, тире - это какой-то необычный char(multi-character character constant), и из-за этого что-то не так работает, оно просто не удаляется из слов. Как нужно это делать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.06.2020, 11:05
Ответы с готовыми решениями:

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

std::string Зачем нужен std::string::compare, если есть перегруженный оператор ==?
Зачем нужен std::string::compare, если есть перегруженный оператор ==?

Удалить все '/' из всех std::string содержащихся в std::vector
Нужно из всех слов содержащихся в векторе убрать все передние слеши. void clear_words(std::vector&lt;std::string&gt; &amp;words)...

48
1 / 1 / 0
Регистрация: 31.01.2020
Сообщений: 148
23.06.2020, 12:24  [ТС]
Студворк — интернет-сервис помощи студентам
Recrut_rf,
C++
1
        str.erase(str.find("—"), 3);
Тире занимает три char-а
upd: если написать всё же так, как у вас, то у меня вместо тире появится вопросик.
0
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,463
23.06.2020, 13:44
Цитата Сообщение от lukinegor Посмотреть сообщение
у меня вместо тире появится вопросик
у меня 'Ч' - надо химичить с кодировками, строками. Я перепробовал пару методов - тире удаляется, но выводится как 'Ч' - я сдаюсь - не знаю как это исправить (ну а если быть совсем уж честным - мне лень искать решение именно данной проблемы - и да, если что, я пробовал и вариант с wstring и выводом через wcout)
0
1 / 1 / 0
Регистрация: 31.01.2020
Сообщений: 148
23.06.2020, 21:54  [ТС]
Recrut_rf, всё равно спасибо.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
24.06.2020, 11:30
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Под виндой юникодную строку из обычной можно получить следующим образом:
подключаем #include <tchar.h>
и используем макрос _T() в который оборачиваем нужную строку
Это не совсем верно.
_T нужен для унифицированного представления "широкой" строки и обычной. Т.е. это именно элемент правильной сборки приложения, непосредственно к юникоду это относится только по касательной.

Собственно _T ничего особенного не делает, он просто добавляет префикс L к строке, если в проекте определен макро UNICODE.

Добавление L делает из обычной строки "широкую". Большинство компиляторов хранит в широких строках одно из представлений юникода. Под виндой - это UTF-16. В Linux - UTF-32.

Добавлено через 21 минуту
Цитата Сообщение от lukinegor Посмотреть сообщение
Тире занимает три char-а
Не три, а два. И это касается только UTF-8. Третий - это завершающий ноль у строки, к "тире" не относится.

Вообще символ Em Dash есть не только в юникоде. Он также присутствует и в русской кодировке CP1251, его код 0x97.

Цитата Сообщение от lukinegor Посмотреть сообщение
тире - это какой-то необычный char (multi-character character constant)
А это как раз не так. Символ в UTF-8 - то просто несколько char с определенными значениями, а multi-character character constant - это, по сути, int. Предупреждение о multi-character character constant вам может выдавать компилятор, если вы пытаетесь впихнуть невпихуемое. Т.е. сохраняете текст в utf-8, как текст в 1251. И по этой же причине получаете "вопросик" в выводе. Не делайте так. Используйте перекодировку перед сохранением. Это сейчас умеют многие текстовые редакторы, например notepad++ и подобные, и это уже совершенно не вопрос программирования.

Цитата Сообщение от Recrut_rf Посмотреть сообщение
выводится как 'Ч' - я сдаюсь - не знаю как это исправить
Странно, вы же читали мой пост на эту тему.
Давайте разберем ваш пример:
Цитата Сообщение от Recrut_rf Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
 
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    std::string str = "wasd—wasd";    
 
    std::cout << str << std::endl;          
    
    str.erase(str.find('—'), 1);
    
 
    std::cout << "after erase: ";
    std::cout << str << std::endl;
   
 
    std::cin.get();
}
Судя по "rus" - вы пользуетесь русской виндой.
"rus" - для русской винды даст локаль Russian_Russia.1251.
Это будет означать, что runtime программы будет перекодировать 1251 в 866 (это кодировка вывода консоли по умолчанию). А это, в свою очередь означает, что строки в вашей программе должны быть в CP1251.
1251 - это кодировка по умолчанию, которую назначает VS для своих исходников, поэтому в таком виде оно вообще-то должно работать как положено, символ Em Dash в 1251 есть, как уже было сказано выше.
1
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,463
24.06.2020, 11:47
Цитата Сообщение от DrOffset Посмотреть сообщение
Добавление L делает из обычной строки "широкую"
я пробовал и L добавлять - результат отрицательный

Цитата Сообщение от DrOffset Посмотреть сообщение
Он также присутствует и в русской кодировке CP1251, его код 0x97
я из неё и брал, но почему то символ (пробовал wchar_t, unsigned char) с таким кодом у меня всё-равно выводит 'Ч' а не '-'

Цитата Сообщение от DrOffset Посмотреть сообщение
поэтому в таком виде оно вообще-то должно работать как положено, символ Em Dash в 1251 есть, как уже было сказано выше
Должно, но почему то у меня не работает наверное потому что я рукожоп что - то не учитываю
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
24.06.2020, 11:54
Цитата Сообщение от Recrut_rf Посмотреть сообщение
я пробовал и L добавлять - результат отрицательный
??!
Что, куда, зачем?

Цитата Сообщение от Recrut_rf Посмотреть сообщение
символ (пробовал wchar_t, unsigned char) с таким кодом у меня всё-равно выводит 'Ч' а не '-'
Ч - это 0x97 в 866. Значит у вас не срабатывает перекодировка из 1251.

Цитата Сообщение от Recrut_rf Посмотреть сообщение
что - то не учитываю
Ну это 100%

Добавлено через 1 минуту
Цитата Сообщение от Recrut_rf Посмотреть сообщение
пробовал wchar_t, unsigned char
Тут фейспалм, уж извините
Если мы речь ведем про 1251 - нафига wchar_t?
0
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,463
24.06.2020, 11:58
DrOffset, все работает - сейчас пересобрал свой же пример, все работает. Похоже у меня студия "глючила" - я человек ленивый часто создаю один проект и добавляю в него новый код вместо старого, от этого студия иногда ведёт себя не совсем адекватно.

DrOffset, всё равно спасибо за пояснение
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
24.06.2020, 12:01
Recrut_rf, если вы сейчас удалите setlocale(LC_ALL, "rus"); то увидите эту Ч.
0
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,463
24.06.2020, 12:33
Цитата Сообщение от DrOffset Посмотреть сообщение
setlocale(LC_ALL, "rus"); то увидите эту Ч
так и есть - и говорит это о том, что setlocale() у меня не подключился, либо я забыл его добавить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.06.2020, 12:33
Помогаю со студенческими работами здесь

Запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’
private: std::string firstName; }; std::string ClientData::getFirstName() const{ return firstName; } Дает в итоге...

Не существует подходящей функции преобразования из std::string в std::string
#pragma once #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &quot;zapisi.h&quot; #include &quot;yslygi.h&quot; #include...

Как правильно перевести std::wstring в std::string ?
Собственно как? :)

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Как привести std::wstring к std::string?
Как привести std::wstring к std::string?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
49
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru