Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
ResourceSpace
Я же в первом сообщении объяснял - приложение для Windows на C++.
Plain-WinAPI-код. Компилятор C++ MSVC. Единственный источник каких-либо входящих данных - функции WinAPI.
А там - голый wchar_t buf[] - который мне жутко надоел, даже конкатенацию не сделать. Просто заменил хранение как std::wstring.

Тут сложение легко, а выкидывание символов делать замаешься, т.к. нет прямого доступа на запись внутрь std::wstring. Лучше бы оставил голый wchar_t buf[]


ResourceSpace
Либо используем промежуточный wchar_t buf[], либо сразу помещаем в std::wstring через buf.c_str() - вполне себе можно получить текст, и из реестра, и откуда угодно.

ъъъъъ
Поясни, о чем речь?
Я говорю:
ResourceSpace
функции ltrim() / rtrim() у меня не компилится, не понимает "<>" для "std::isspace". Надо что-то подключить?
ResourceSpace
пример trim'ов со stackoverflow по ссылке выше, как я уже писал - просто не компилится, вероятнее всего нужен ещё #include, но я не нашёл какой.
Вот тот код со stackoverflow:
std::string& ltrim(std::string& str) {
	auto it2 = std::find_if(str.begin(), str.end(), [](char ch) { return !std::isspace<char>(ch, std::locale::classic()); });
	str.erase(str.begin(), it2);
	return str;
}

std::string& rtrim(std::string& str) {
	auto it1 = std::find_if(str.rbegin(), str.rend(), [](char ch) { return !std::isspace<char>(ch, std::locale::classic()); });
	str.erase(it1.base(), str.end());
	return str;
}
Вот ошибка компиляции:
MSVS
Предупреждение C4551 в вызове функции отсутствует список аргументов
Ошибка C2062 тип "char" не требуется
Эти пишет на каждый "char>" после "isspace<". При этом во всплывашке "использование имени типа не допускается".
Да 98% что какого-то #include не хватает, как бы выяснить какого именно?


Если у тебя wchar_t то зачем используешь std::string в параметрах? он только с char работает. Для wchar_t есть std::wstring

ResourceSpace
Dima T
Допустим в итоге так получится
L"ОднаждыВ студёную зимнюю пору,Я из лесу вышел,Был сильный мороз...  \t            ";
Это правильно?
Такие стандартные штуки как TrimLeft и TrimRight удаляет пробельные символы только с одного края:
L"Однажды\r\nВ студёную зимнюю пору,\r\nЯ из лесу вышел,\r\nБыл сильный мороз...";
Но желательно до такого вида:
L"однажды\nв студёную зимнюю пору,\nя из лесу вышел,\nбыл сильный мороз...";

Завтра дам примеры кода
11 ноя 20, 20:48    [22230436]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
ъъъъъ
Сомнений нет: ТС - тролль.

Никакой он не тролль, просто офигел от тонкостей С/С++ как и все начинающие.
11 ноя 20, 20:50    [22230437]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
Это просто оригинальный код со stackoverflow.
Я его скопировал и сперва сразу поменял под UTF-16 - а оно и не работает.
Тогда думаю ну может я что-то не так подправил, испортил, вернул к оригинальному виду - а всё равно не хочет.

Насколько я смог понять - оно думает что std::isspace это обычная функция из <ctype.h>, а не шаблон. Возможно такой шаблон где-то в другом месте. Гугл от угловых скобок только путается.
Dima T
Лучше бы оставил голый wchar_t buf[]
Неудобно же вообще совсем. Так хоть что-то могу с ними делать.
Dima T
Завтра дам примеры кода
Спасибо большое!
11 ноя 20, 21:02    [22230446]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
ResourceSpace, почему С++ надо? Если виндавс и строки, то C# просится, там все есть, все просто, под начинающих заточено. В С++ чтобы осилить эту тему надо стать гуру.
11 ноя 20, 21:15    [22230450]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51774

Dima T
а в "std::" этого вообще нет.

Есть: https://en.cppreference.com/w/cpp/locale

ResourceSpace
Plain-WinAPI-код. Компилятор C++ MSVC. Единственный источник каких-либо входящих данных -
функции WinAPI.
А там - голый wchar_t buf[] - который мне жутко надоел, даже конкатенацию не сделать.

А если поискать?.. https://en.cppreference.com/w/c/string/wide/wcscat

Posted via ActualForum NNTP Server 1.5

11 ноя 20, 21:19    [22230452]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Dimitry Sibiryakov

Dima T
а в "std::" этого вообще нет.

Есть: https://en.cppreference.com/w/cpp/locale

Ты как всегда сумничал, эта ссылка мне непонятна, а TCу тем более. Дай простой пример кода как сделать
tolower(L"CHEck ПРОверка")

чтобы получилось "check проверка"
11 ноя 20, 21:29    [22230457]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51774

Пример в https://en.cppreference.com/w/cpp/locale/tolower недостаточно доходчив?..

Posted via ActualForum NNTP Server 1.5

11 ноя 20, 22:11    [22230469]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 760
ResourceSpace,


Проблема \r\n (именно в таком порядке) и string/setting ортогональны.

В юниксах стояки разделяются \n, одним символом он же LF=10

ДОС сделал "умно" через CR/LF, чтоб текстовые файлы проще печатать на допотопные принтеры, а потом с этим и застряли..

Отсюдамвыросли новые хаки, вроде fopen( , "rt"), чтоб ловчее прятать эти уже никому не нужные CR.

Но они так и остались, как в файлах так и в памяти. Windows. Multiline Edit? CR/LF.

Ещё в Винде почему-то принято последнюю строку файла заканчивать CR/LF, как вроде там она нужна.

Новый проект в винде? Пишите все широкими "W" функциями,

Старый проект? Почитайте про SBCS/MBCS, там есть грабли.
12 ноя 20, 08:04    [22230545]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
ResourceSpace
Но желательно до такого вида:
L"однажды\nв студёную зимнюю пору,\nя из лесу вышел,\nбыл сильный мороз...";

+ Исходник
static void clean(std::wstring& str) {
	// Убираем несколько \r \n подряд с заменой на один \n
	bool is_write = true;
	std::wstring::iterator p = str.begin();

	for(std::wstring::iterator i = str.begin(); i != str.end(); i++) {
		switch(*i) {
		case L'\r':
			*i = L'\n';

		case L'\n':
			if(is_write) {
				*p = *i;
				p++;
				is_write = false;
			}
			break;

		default:
			*p = *i;
			p++;
			is_write = true;
		}

	}

	// Убраем замыкающие переводы строк, пробелы и табуляции
	for(; p != str.begin(); p--) {
		if(*p != L'\n' && *p != L'\t'&& *p != L' ') {
			p++;
			break;
		}
	}

	// Обрезаем ненужный хвост
	if(p != str.end()) {
		str.resize(p - str.begin());
	}
}

int main() {
	std::wstring str = { L"Однажды\r\nВ студёную зимнюю пору,\r\nЯ из лесу вышел,\r\nБыл сильный мороз...  \t   \r\n   \r\n   \r\n   \r\n" };
	clean(str);
	for(auto& i : str ) printf("%d ", i);
	return 0;
}
12 ноя 20, 08:39    [22230556]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51774

Ну да, давайте в С++ писать как в С. Зачем вам вообще тогда плюсы?
std::wistringstream s(L"однажды\nв студёную зимнюю пору,\nя из лесу вышел,\nбыл 
сильный мороз...");
while (s)
{
   std::wstring c;
   s >> c;
   std::cout << c;
}

Posted via ActualForum NNTP Server 1.5

12 ноя 20, 13:38    [22230723]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Dimitry Sibiryakov
Ну да, давайте в С++ писать как в С. Зачем вам вообще тогда плюсы?
std::wistringstream s(L"однажды\nв студёную зимнюю пору,\nя из лесу вышел,\nбыл 
сильный мороз...");
while (s)
{
   std::wstring c;
   s >> c;
   std::cout << c;
}

Не умничай а дай вариант для плюсов и для не плюсов.
12 ноя 20, 16:41    [22230911]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51774

PetroNotC Sharp
дай вариант

Вариант чего? Бессмысленного кода, годящегося только для лабы на первом курсе?..

Posted via ActualForum NNTP Server 1.5

12 ноя 20, 17:16    [22230961]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
На самом деле это проблема. И проблема в системной необученности. Какой-то ВУЗ или преподаватель
продолжает штамповать на выходе "C" - шников. Далее эти сишники приходят в С++ и привносят туда
свой чудесный опыт. Далее - в нашем форуме появляется Несколько глупых вопросов....

Я как всегда считаю что автор нивчем неуиновный. А виновна система.
12 ноя 20, 17:25    [22230972]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51774

mayton
А виновна система.

Валить вину на кого-то другого это так по-детски... "Я не виноват, ваза сама со стола
спрыгнула!"

Posted via ActualForum NNTP Server 1.5

12 ноя 20, 17:29    [22230979]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Dimitry Sibiryakov

Ну да, давайте в С++ писать как в С. Зачем вам вообще тогда плюсы?

Мну оно вообще незачем, я много раз говорил что я в плюсах разбираюсь как свинья в апельсинах, я С знаю и классы немного, я тупо молчал с начала топика, до тех пор пока вместо того чтобы помочь ТСа стали закидывать тухлыми помидорами. Я дал ему решение его проблемы, кто хочет дать решение лучше - дайте.
12 ноя 20, 19:02    [22231053]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
ого! Пожалуй даже красиво. Спасибо огромное, пригодится.
Но неужели все самые обычные операции так вот "вручную" придётся?

И кстати я нашёл в каком инклуде было "std::isspace<>" нужное для ltrim() / rtrim()...
Но его подключение почему-то портит "std::transform" из "toLower()" (на первой странице темы было)... Но ладно, фиг с ним...
Нормальных методов trim() / lower() / upper() в std этом что-то не наблюдается, наверное просто плюну и возьму API типа CharLowerW()...
13 ноя 20, 12:10    [22231337]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
ResourceSpace
обычные операции
у тебя не обычные и кроссплатформенные.
Обычные в дельфи и пыхе
13 ноя 20, 12:21    [22231349]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
tip78
Member

Откуда: Москва
Сообщений: 1005
ResourceSpace
Dima T
Допустим в итоге так получится
L"ОднаждыВ студёную зимнюю пору,Я из лесу вышел,Был сильный мороз...  \t            ";

Это правильно?
Такие стандартные штуки как TrimLeft и TrimRight удаляет пробельные символы только с одного края:
L"Однажды\r\nВ студёную зимнюю пору,\r\nЯ из лесу вышел,\r\nБыл сильный мороз...";

Но желательно до такого вида:
L"однажды\nв студёную зимнюю пору,\nя из лесу вышел,\nбыл сильный мороз...";

как минимум, регекспом можно рубануть
ещё есть wstring.find() .rfind() .substr() .replace() .erase() и прочие
а потом ещё есть 100+ ф-й в STL

ребята третью страницу не могут понять, зачем рубать спец.символы
надо было спрашивать проще: как убрать 'a' из строки "ajfieo vaf na afj rga"?

Сообщение было отредактировано: 24 ноя 20, 17:10
24 ноя 20, 17:10    [22237918]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Dimitry Sibiryakov

mayton
А виновна система.

Валить вину на кого-то другого это так по-детски... "Я не виноват, ваза сама со стола
спрыгнула!"

Виноват один датский козёл, которому надо было выпить "капель датского короля"
еще в 20м веке или создать нормальный язык программирования с семантикой internal
string type в сам language. И сегодня велосипедят всякие там STD::, CString, TString e.t.c.
просто как следствие этого упущения.
24 ноя 20, 17:18    [22237928]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
egorych
Member

Откуда: и зачем;
Сообщений: 4809
mayton
Виноват один датский козёл, которому надо было выпить "капель датского короля"
еще в 20м веке или создать нормальный язык программирования с семантикой internal
string type в сам language. И сегодня велосипедят всякие там STD::, CString, TString e.t.c.
просто как следствие этого упущения.
а по мне так это достоинство, а не недостаток. пойди ка в вижуалбэйсике или жабе напиши свою строку попробуй)
24 ноя 20, 18:21    [22237958]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Это - фундаментальная часть языка. Основа. Зачем ее переписывать? У тебя-ж не возникает
желания переписать integer ?
24 ноя 20, 18:23    [22237959]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10760
Невозможно встроить в язык все загогулистые особенности обработки строк.
Основная проблема в том, что сначала строки были массивом байт, потом решили уйти от байт, но сейчас обратно возвращаются к байтам. А всевозможные API добросовестно отражают все эти годы метаний.
24 ноя 20, 18:31    [22237961]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51774

mayton
У тебя-ж не возникает желания переписать integer ?

Довольно сложно переписать процессорный тип. А вот строки в процессоре нет - вольная воля.

Как был Си продвинутым ассемблером, так и плюсы его не изменили.

Posted via ActualForum NNTP Server 1.5

24 ноя 20, 19:08    [22237971]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
tip78
Member

Откуда: Москва
Сообщений: 1005
Dimitry Sibiryakov
А вот строки в процессоре нет - вольная воля.

ascii таблица не там хранится?
пока все не станем англичанами будем грабли собирать.
24 ноя 20, 20:30    [22238011]     Ответить | Цитировать Сообщить модератору
 Re: Несколько глупых вопросов по std::string и std::wstring  [new]
Dima T
Member

Откуда:
Сообщений: 15282
tip78
Dimitry Sibiryakov
А вот строки в процессоре нет - вольная воля.

ascii таблица не там хранится?
пока все не станем англичанами будем грабли собирать.

Давно уже придуман юникод, но ascii древнее, кое-где еще живет.
24 ноя 20, 22:07    [22238029]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / C++ Ответить