powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сортировка по алфавиту
25 сообщений из 65, страница 2 из 3
Сортировка по алфавиту
    #39971668
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab, ты забыла упомянуть, что для чувствительности функций строк к национальной сортировки, эту самую локаль необходимо настроить, иначе алгоритм годится только для case sensitive сортировки по однобайтой кодировке, в которой буквы уже упорядочены, типа cp1251 русская. При попытке использовать ту же кодировку, но с украинской сортировкой, или же case insensitive сортировку, результат будет некорректен.
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971673
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обсуждение любой сортировки рано или поздно приходит к Collation Rules и национальным кодировкам.
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971690
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, а в конечном итоге, к использованию таких спецификаций как UCA (Unicode Collation Algorithm) и библиотек типа icu-project , позволяющих получить по строке ключ сортировки, исходя из настроек сортировки.
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971806
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вариант с locale
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
#include <stdio.h>
#include <string.h>
#include <locale.h>

char (*sort_words(char (*words)[80], int size, char *locale ))[80] {
	int i;
	int n = size;
	char temp[80];
	short int sorted = 1;

	setlocale(LC_COLLATE, locale);

	while(sorted) {
		sorted = 0;
		for (i=0; i<n-1; i++) {
			if ( strcoll(words[i], words[i+1]) > 0 ) {
				sorted = 1;
				strcpy(temp, words[i]);
				strcpy(words[i], words[i+1]);
				strcpy(words[i+1], temp);
			}
		}
	}
	return words;
}


...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971864
сабстринги и регекспы - не работают в кириллических строках, если это не wstring.
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971869
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab, это вариант с 1 locale? А если локали две?
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971894
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

в данном случае в локале нас интересуте только параметр collation, т.е. я не думаю, что это создаст проблему

код и результаты для en_US.UTF-8
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
#include <stdio.h>
#include <string.h>
#include <locale.h>

char (*sort_words(char (*words)[80], int size, char *locale ))[80] {
	int i;
	int n = size;
	char temp[80];
	short int sorted = 1;

	setlocale(LC_COLLATE, locale);

	while(sorted) {
		sorted = 0;
		for (i=0; i<n-1; i++) {
			if ( strcoll(words[i], words[i+1]) > 0 ) {
				sorted = 1;
				strcpy(temp, words[i]);
				strcpy(words[i], words[i+1]);
				strcpy(words[i+1], temp);
			}
		}
	}
	return words;
}

int main(void) {
	char test[10][80] = {
			"Apple", "Mango",
			"Яблоко", "Слива", "Груша", "арбуз", "Лимон",
			"Cherry", "blueberry", "Strawberry"
	};
	int n = 10;
	char locale[] = "en_US.UTF-8";
	//char locale[] = "C"

	char (*ptr)[80];

	ptr = sort_words(test, n, locale);

	for (int i=0; i<n; i++) {
		printf("%s\n", ptr[i]);
	}
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Apple
blueberry
Cherry
Mango
Strawberry
арбуз
Груша
Лимон
Слива
Яблоко
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971900
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза,
сабстринги и регекспы - это уже другая тема, я еще пока не умею в С регекспы делать
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971905
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза
сабстринги и регекспы - не работают в кириллических строках, если это не wstring.
Шо вообще? Как же так? Как же мы живем?
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971908
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мдя. Придется переходить на латиницу.

Budem pisat kak Polyaki.
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971915
White Owl
Алексей Роза
сабстринги и регекспы - не работают в кириллических строках, если это не wstring.
Шо вообще? Как же так? Как же мы живем?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    setlocale(LC_ALL, "ru_RU.utf8");

    string str = "техническая строка для тестов"; // 26 символов + 3 пробела
    cout << str.length() << endl; // 55 (52 + 3)
    cout << sizeof(str) << endl; // 32
    cout << str.find("для") << endl; // 36 (упс. wstring покажет 20)

    cout << str.substr(36, 3) << endl; // д&#65533;

    str.replace(str.find("для"), 3, "не для"); // техническая строка не для&#65533;я тестов
    cout << str << endl;
// ну технически то воткнул в правильное место, хотя насчитал позицию 36, но воткнул таки с кракозяброй
// (этот знак вопроса в ромбе означает "половину символа", т.е. 1 байт вместо двух)


нах так жЫть?!
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971920
пардон, wstring покажет 19
и есессно всё корректно отображает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
    wstring str = L"техническая строка для тестов"; // 26 символов + 3 пробела
    wcout << str.length() << endl; // 29
    wcout << str.find(L"для") << endl; // 19

    wcout << str.substr(str.find(L"для"), 3) << endl;

    str.replace(str.find(L"для"), 3, L"не для");
    wcout << str << endl;
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971925
mayton, обнаружен баг:
эта кнопка "Изменить" пропадает через некоторое время
и это ок.
Но почему она не пропадает, когда по ней жмёшь и получаешь "Извините, у вас нет прав редактировать данное сообщение."
надо либо убирать её совсем, раз время вышло, либо добавить время.
(или оно обламывает после 5 редактирований - хз)
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971932
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза,

Код: plaintext
1.
  setlocale(LC_ALL, "ru_RU.utf8");



некомильфо!
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971934
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза
mayton, обнаружен баг:
эта кнопка "Изменить" пропадает через некоторое время
и это ок.
Но почему она не пропадает, когда по ней жмёшь и получаешь "Извините, у вас нет прав редактировать данное сообщение."
надо либо убирать её совсем, раз время вышло, либо добавить время.
(или оно обламывает после 5 редактирований - хз)

Это не ко мне вопрос. Это в обуждение нашего сайта.
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971948
mini.weblab
Алексей Роза,

Код: plaintext
1.
  setlocale(LC_ALL, "ru_RU.utf8");




некомильфо!

чёйто?
wstring с LC_COLLATE вообще кириллицу НЕ показывает.
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971949
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
Алексей Роза,
сабстринги и регекспы - это уже другая тема, я еще пока не умею в С регекспы делать

И лучше не делай. С++ это тебе не Перл.
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971969
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза,
потому что для функции, отвечающей за сортировку важен только порядок букв, поэтому мы ей даем доступ только к LC_COLLATE.
с какого перепугу ей вдруг менять всю локаль?
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971982
с этого перепугу:
Алексей Роза
wstring с LC_COLLATE вообще кириллицу НЕ показывает.

и зачем вообще программе кусок локали? остальное что, солить?
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39971999
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как нам вот это отсортировать?

Лёва Толстый - Война и Мир -- Еh bien, mon prince. Gênes et Lucques ne sont plus que des apanages,
des поместья, de la famille Buonaparte. Non, je vous préviens, que si vous
ne me dites pas, que nous avons la guerre, si vous vous permettez encore de
pallier toutes les infamies, toutes les atrocités de cet Antichrist (ma
parole, j'y crois) -- je ne vous connais plus, vous n'êtes plus mon ami,
vous n'êtes plus мой верный раб, comme vous dites. [1] Ну,
здравствуйте, здравствуйте. Je vois que je vous fais peur, [2]
садитесь и рассказывайте.
Так говорила в июле 1805 года известная Анна Павловна Шерер, фрейлина и
приближенная императрицы Марии Феодоровны, встречая важного и чиновного
князя Василия, первого приехавшего на ее вечер. Анна Павловна кашляла
несколько дней, у нее был грипп, как она говорила (грипп был тогда новое
слово, употреблявшееся только редкими). В записочках, разосланных утром с
красным лакеем, было написано без различия во всех:
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39972000
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По бинарным кодам. Или "дербанить" текст, размеченный на (естественные) яызки.
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39972005
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, через получение ключа сортировки из библиотеки icu при настройках language insensitive + case insensitive + accent insensitive.
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39972036
mayton
А как нам вот это отсортировать?

по индексу очевидно.
иначе что вы там вообще сортировать собрались? рандомный текст?
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39972538
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    setlocale(LC_ALL, "ru_RU.utf8");

    string str = "техническая строка для тестов"; // 26 символов + 3 пробела
    cout << str.length() << endl; // 55 (52 + 3)
    cout << sizeof(str) << endl; // 32
    cout << str.find("для") << endl; // 36 (упс. wstring покажет 20)

    cout << str.substr(36, 3) << endl; // д&#65533;

    str.replace(str.find("для"), 3, "не для"); // техническая строка не для&#65533;я тестов
    cout << str << endl;
// ну технически то воткнул в правильное место, хотя насчитал позицию 36, но воткнул таки с кракозяброй
// (этот знак вопроса в ромбе означает "половину символа", т.е. 1 байт вместо двух)



а я знаю, почему это так ! :-)
это потому, что размер char 1 байт, а размер UTF-8 символа может занимать от 1 до 4 байтов, и он полностью в char не помещается.
...
Рейтинг: 0 / 0
Сортировка по алфавиту
    #39972544
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabэто потому, что размер char 1 байт

Нет, это потому что кто-то загнал в код забавного бага, воткнув в replace константу 3
вместо strlen("для").
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 65, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сортировка по алфавиту
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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