powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Несколько глупых вопросов по std::string и std::wstring
25 сообщений из 125, страница 1 из 5
Несколько глупых вопросов по std::string и std::wstring
    #40016830
ResourceSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Начал писать мини-проект: консольное приложение для Windows на C++.
Для работы со строками выбрал std::string и std::wstring. Вроде себе ничего такие. Только у меня по ним парочка вопросов...

Первое, в W-функциях WinAPI используется что именно - UTF-16 или UCS-2?
А как/что хранит/поддерживает std::wstring? А в чём разница?
Можно ли их как-то отличать в runtime по факту/содержимому (например хотя бы в отладчике)?

Второе, я получил текст из W-функции WinAPI, засунул его в std::wstring, но оказалось что в этом тексте куча символов "\r" и "\n" - как бы их убрать попроще? Причём иногда мне надо их убирать полностью все, а иногда только если они в начале/конце.
И ещё консоль как-то криво выводит строки, в которых разные сочетания "\r" и "\n" (с этим я пока не выявил зависимость). Приводить бы их как-то к единому заданному виду, что ли? Как-то можно?

Третье, мне нужно сделать тексту внутри std::wstring (самому содержимому) нижний регистр.
Нагуглил какой-то способ (std::transform + std::tolower), но он, нормально работая для латиницы, чё-то игнорирует кириллицу...

И последнее - как правильно конвертировать std::string <~> std::wstring?
Гугл предлагает либо MultiByteToWideChar и что-то аналогичное (но я как-то сильно не уверен в некоторых параметрах), либо пишет что как бы были какие-то методы в самом std:: но они типа упразднены, но вы можете воспользоваться всякими другими библиотеками.
Мне бы хотелось обойтись без лишнего, вот подключил я уже std:: этот - он сам свои же типы не может что ли сконтачить? Только через дополнительных посредников и СМС?

Спасибо!
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016844
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace
получил текст из W-функции WinAPI, засунул его в std::wstring, но оказалось что в этом тексте куча символов "\r" и "\n" - как бы их убрать попроще?
код дай
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016846
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace
И ещё консоль как-то криво выводит строки, в которых разные сочетания "\r" и "\n" (с этим я пока не выявил зависимость)

Это спецсимволы для управления курсором в консоли:
"\r" - возврат курсора в начало текущей строки, если что-то было в строке, то новое будет писаться поверх старого
"\n" - переход в начало следующей строки

https://ru.wikipedia.org/wiki/Перевод_строки
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016857
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace

И ещё консоль как-то криво выводит строки, в которых разные сочетания "\r" и "\n" (с этим я пока не выявил зависимость). Приводить бы их как-то к единому заданному виду, что ли? Как-то можно?

Исторически сложилось что переводы строк не стандартизированы. Это может быть Unix-перевод строки (1 символ \n)
или DOS/Windows-вариант (\n\r).

Поэтому обрабатыай все ситуации.
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016879
ResourceSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переводы строк мне хорошо известны. Вопрос был как раз как их обрабатывать , когда они в std::string или std::wstring.

PetroNotC Sharp
код дай

Какой код? Внутри переменной типа std::wstring текст оканчивающийся на "\r\n\r\n\r\n" - как их убрать, допустим, только с конца? И как, если надо из всего текста?

ResourceSpace
И ещё консоль как-то криво выводит строки, в которых разные сочетания "\r" и "\n" (с этим я пока не выявил зависимость).

Всё, выявил. При выводе в консоль нельзя чтоб в строке было одинокое "\r". Хотя тут можно было и так догадаться. :)
Однако, оказалось что в идеале должно быть наоборот одинокое "\n". По крайней мере для mode используемом на данный момент. хм...
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016891
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace

Какой код? Внутри переменной типа std::wstring текст оканчивающийся на "\r\n\r\n\r\n" - как их убрать, допустим, только с конца? И как, если надо из всего текста?

Не кипятись. Послушай старого модератора.
В этом форуме иногда 1 строчка кода стоит целого абзаца поясняющего текста.
Поэтому когда чел тебя просит - то будь добр, предоставь.

Этож не сложно?
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016916
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpaceВопрос был как раз /как их обрабатывать/, когда они в std::string или std::wstring.

Обычно - никак, потому что в строках эти символы сами собой не появляются без (весьма
значительных) усилий со стороны программиста.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016940
ResourceSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Обычно - никак
Как никак? std:: вообще не поддерживает работу со своим содержимым?
Поиск подстроки, замена подстроки, конкатенация, в верхний регистр, в нижний регистр - не, ненада ничего? :)
mayton
Не кипятись.
Никто не кипятился. :) Просто поясняю - вопрос задан относительно работы с типом данных, в общем случае, а не какой-то узкой ситуации, теоретический вопрос.
В функцию передан std::wstring, текст может быть какой угодно, он извне. Надо убрать из текста "\r\n" - в одном случае только в конце, в другом во всём тексте.
mayton
Этож не сложно?
Ну вот вам такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
void tripleOut(const std::wstring& str) {
	wprintf(L"%ls\n%ls\n%ls", str.c_str(), str.c_str(), str.c_str());
}

void myFunc(const std::wstring& str) {
	// str приходит извне, от меня её содержимое не зависит никак;
	// а содержимое str может оканчиваться на \r\n или на \r\n\r\n или на \r\n\r\n\r\n - надо их все убрать;
	// чисто для примера:
	tripleOut(str);
}

Ожидаю:
C:\Utils>myApp.exe
line
line
line
C:\Utils>А получается:C:\Utils>myApp.exe
line



line



line



C:\Utils>А по остальным пунктам пока глухо?
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016943
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace, ну вот твой кейс. Пока строчка еще std - надо из нее отрезать все "spacers" справа (rtrim())
и только потом в конце преобразовать в С-строку.

https://stackoverflow.com/questions/25829143/trim-whitespace-from-a-string/25829178
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016945
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpaceПоиск подстроки, замена подстроки, конкатенация, в верхний регистр, в нижний регистр - не,
ненада ничего? :)

Есть. Внезапно, но все эти методы описаны в документации:
https://en.cppreference.com/w/cpp/string/basic_string/

Но вот чтобы в строке были '\r' или '\n' - верится с трудом. Пусть даже она и "приходит
извне".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016955
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Библиотечные функции обычно например, убрать пробелы в конце или начале.
У тебя Нетипичные спец символы.
Вполне можешь в цикле посимвольно их убрать.
И действительно разберись, почему тебе приходит на вход мусорная свалка.
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016956
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попытаюсь пованговать: он вывод какого-то консольного приложения перехватывает и хочет анализировать, но не понимает как это сделать.
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016959
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПопытаюсь пованговатьь: он вывод какого-то консольного приложения перехватывает

Не, это слишком сложно. Ставлю на то, что он эти классы использует как буфер. Типа:
Код: sql
1.
read(f, 100, string.begin());


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016963
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Попытаюсь пованговать: он вывод какого-то консольного приложения перехватывает и хочет анализировать, но не понимает как это сделать.

Дык этож для Перл задачка! А где этот Прохоров-Милторг? Он щас тут быстро всё порешает одной регуляркой.

Офигеете как это жутко красиво будет.
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40016980
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Попытаюсь пованговать: он вывод какого-то консольного приложения перехватывает и хочет анализировать, но не понимает как это сделать.
одно то что он это скрывает, уже характеризует его характер))))
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40017011
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace
Приводить бы их как-то к единому заданному виду, что ли? Как-то можно?
std::endl?
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40017034
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace
в W-функциях WinAPI используется что именно - UTF-16 или UCS-2?

UTF-16
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40017188
ResourceSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton , спасибо за ссылку, любопытно. Но неужели надо вот так вот по-всякому изворачиваться для стандартной операции над строкой?
И функции ltrim() / rtrim() у меня не компилится, не понимает "<>" для "std::isspace". Надо что-то подключить?
Первый раз в жизни вижу ошибку компиляции вида "X не требуется" , смешно. :)

Dimitry Sibiryakov , Dima T , нет, программист никогда не писавший на С/С++ создал проект в VS и обнаружил что в С++ нет нормального встроенного типа данных "строка".
Зато есть просто куча разных непонятных библиотек, в которых кто во что горазд, и непонятно что и как лучше выбрать вообще. Ну вот взял я std::[w]string - и чего, и как?
Dimitry Sibiryakov
... все эти методы описаны в документации: ...
По вашей ссылке:
  • конкатенация - есть, работает, даже через просто операцию "+", отлично;
  • поиск подстроки - вроде есть, a sort of (в каком-то виде);
  • замена подстроки - якобы есть, но если вчитаться - оно как-то через попу, нормальном виде нема?
  • в верхний регистр - не вижу;
  • в нижний регистр - не вижу;
  • trim / trim-left / trim-right - не вижу;
А некоторые методы типа starts_with() и ends_with() помечены как "C++20". А у меня вроде максимум "11" можно. Как вы вообще работаете со строками все эти года? %))
Dimitry Sibiryakov
... чтобы в строке были '\r' или '\n' - верится с трудом ...
PetroNotC Sharp
У тебя Нетипичные спец символы ... мусорная свалка.
Вы чего, какие "нетипичные", какая "свалка" - это же обычные переводы на новую строку, в любом тексте они пачками.
PetroNotC Sharp
Вполне можешь в цикле посимвольно их убрать.
Был бы обычный массив - легко бы убрал давно. А вот как это сделать - когда оно в std::string / std::wstring?
PetroNotC Sharp
Библиотечные функции обычно например, убрать пробелы в конце или начале.
Как называется эта "библиотечная функция убрать пробелы в конце или начале" и в каком заголовке/инклюде она находится?

Остальные пункты всё ещё глухо?
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40017194
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpaceВы чего, какие "нетипичные", какая "свалка" - это же обычные переводы на новую строку, в
любом тексте они пачками.

При попадании "любого текста" в строку они автоматически исчезают. Так что ты с
воображаемыми проблемами борешься.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40017195
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace
это же обычные переводы на новую строку, в любом тексте они пачками.
гугл перед носом? Дай ссыль на такой текст как Типичный и Распространенный.
Там где куча спец знаков с которыми надо бороться.
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40017197
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace
Остальные пункты всё ещё глухо?
повтори какие.
Проход посимвольно в цикле для std::string тут наверно было. Или нет?
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40017208
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если так уж трудно работать с <wstring>, то загрузи С-библиотеку <cwchar>.
Там куча понятных и простых функций...
http://www.cplusplus.com/reference/cwchar
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40017213
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace
Dimitry Sibiryakov , Dima T , нет, программист никогда не писавший на С/С++ создал проект в VS и обнаружил что в С++ нет нормального встроенного типа данных "строка".

Тут еще много чего нет что везде есть, а еще кое-что совсем не так. Все присутствующие это прекрасно знают и искренне не понимают на которую из граблей ты наступил, а гадать просто устанешь.
Ты начинай писать код, приводи пример того что не работает, подскажут.
ResourceSpace
Зато есть просто куча разных непонятных библиотек, в которых кто во что горазд, и непонятно что и как лучше выбрать вообще. Ну вот взял я std::[w]string - и чего, и как?

В С/С++ нет нормальных строк потому что изначально строкой был массив char[], т.е. символы в однобайтовой ASCII кодировке. Потом для удобства сделали класс std::string, по сути это обертка над char[].
Потом появился тип wchar_t двухбайтовый, для UTF-16, соответственно строка в виде массива wchar_t[] и обертка std::wstring.
Ну и куча сторонних библиотек.

PS WinAPI с буковкой W на конце для wchar_t[], с A для char[], вообще без буквы - выбор задается в свойствах проекта, по умолчанию W
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40017278
ResourceSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov , PetroNotC Sharp - уж простите, но какие-то вы просто тролли. "Нетипичные"? "Исчезают"?
Объясняю последний раз, и последующие высказывания про переводы строк просто игнорирую. Берём ваши цитаты:
Dimitry Sibiryakov
Так что ты с
воображаемыми проблемами борешься.
PetroNotC Sharp
Дай ссыль на такой текст как Типичный и Распространенный.
Там где куча спец знаков с которыми надо бороться.
В данном тексте, написанном и отправленным на форум вами - содержатся символы "\r" и "\n".
Если выделить текст любой из ваших цитат и скопировать в буфер обмена - в буфере обмена тоже будут содержаться символы "\r" и "\n".
Если вставить текст из буфера обмена в программу "Блокнот" и сохранить в файл - в дочернем окне "Блокнота" с классом EDIT будет установлен текст, содержащий символы "\r" и "\n", и в файле тоже будут символы "\r" и "\n".
Для вас это сюрприз..?



Dima T , да это я всё знаю, десяток лет WinAPI и COM пользуюсь. Только из языков с нормальными строками.
Просто думал что уж за столько лет и столько версий как VS так и самого C++ - можно же уже было сделать нормально?
Каждую простейшую стандартную операцию над текстом придётся отдельно гуглить и писать свои реализации? Это же капец, не?
Dima T
приводи пример того что не работает, подскажут.
У меня нет неработающего. Просто нужно производить со строками стандартные операции, нужна модификация текста. А я без понятия как, привычных методов или функций тупо нету.
Ну вот из того что я нагуглил, но работает почему-то частично:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void toLower(std::wstring& str) { // req: <algorithm>
	std::transform(str.begin(), str.end(), str.begin(), std::tolower);
}

void myFunc(std::wstring& str) {
	// str приходит извне, от меня её содержимое не зависит никак;
	wprintf(L"%ls\n", str.c_str()); // допустим, выведет такое: CHEck ПРОверка
	toLower(str);
	wprintf(L"%ls\n", str.c_str()); // тогда тут выведет уже: check ПРОверка
	// и чего оно кириллицу не тронуло, а? надо чтоб было: check проверка
	// при этом - украинский, немецкий и греческий - тоже вполне может быть в тексте
}

Не понимаю, а словами без кода не было понятно что требуется?
А пример trim'ов со stackoverflow по ссылке выше, как я уже писал - просто не компилится, вероятнее всего нужен ещё #include, но я не нашёл какой.
Ещё я спрашивал про конвертацию std::string <~> std::wstring - нормально ли будет через MultiByteToWideChar и WideCharToMultiByte, или в самой этой "std::" для этого уже что-то есть?

d7i , большое спасибо, посмотрю.
...
Рейтинг: 0 / 0
Несколько глупых вопросов по std::string и std::wstring
    #40017295
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
25 сообщений из 125, страница 1 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / Несколько глупых вопросов по std::string и std::wstring
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]