-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
1

Функция strxfrm

16.12.2017, 06:39. Показов 873. Ответов 13
Метки нет (Все метки)

Совершенно непонятно, как работает эта функция.
Вот ее прототип:

C++
1
size_t strxfrm(char * str1, char const cstr2, size_t count);
Говорится, что вообщем она работает подобно функции strnsmp, но только перед копированием строка, представленная вторым аргументом, подвергается какому-то преобразованию.

Но какому и в чем его суть совершенно непонятно.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2017, 06:39
Ответы с готовыми решениями:

Функция поиска в массиве и указатели + функция сортировки и поиск найденного элемента
Написать функцию поиска максимального элемента, передать в неё указатель на начало и конец поиска и...

Функция удаления текста в скобках [2], непосредственно функция + 12кб вложений
Доброго времени суток, случилось так, что пришлось работать с с-строками (лаба, угу), в которой...

Перегрузка операций: friend-функция или функция-член класса
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и...

Функция sqrt: существует более одного экземпляра. Функция перегруженная
#include <iostream> #include <math.h> #include <iomanip> using namespace std; int main(){...

13
7084 / 6085 / 2774
Регистрация: 14.04.2014
Сообщений: 26,174
16.12.2017, 08:37 2
Во что именно строка преобразуется, не стандартизировано и зависит от реализации. Смысл в том, что преобразованные строки можно сравнивать обычной функцией и результат должен соответствовать принятому для соответствующего языка порядку. В русском, например, слова на Ё должны идти после слов на Е, хотя в 1251 буква Ё по коду меньше всего остального алфавита.
В VS почему-то не работает правильно.
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
16.12.2017, 09:58  [ТС] 3
Цитата Сообщение от nmcf Посмотреть сообщение
Во что именно строка преобразуется, не стандартизировано
Ну вообще то что-то говориться на эту тему. А именно строка преобразуется в текущую локаль, то есть в соответствии со значением LC_COLLATE.
Непонятно только в чем суть этого преобразования. Какая она была изначально, такой она и остается
0
7084 / 6085 / 2774
Регистрация: 14.04.2014
Сообщений: 26,174
16.12.2017, 10:05 4
Цитата Сообщение от Просто Саша Посмотреть сообщение
Какая она была изначально, такой она и остается
Ты где проверял? Для какого языка?

Transforms the null-terminated byte string pointed to by src into the implementation-defined form such that comparing two transformed strings with std::strcmp gives the same result as comparing the original strings with std::strcoll, in the current C locale.
This function is used when making multiple locale-dependent comparisons using the same string or set of strings, because it is more efficient to use std::strxfrm to transform all the strings just once, and subsequently compare the transformed strings with std::strcmp.
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
16.12.2017, 10:17  [ТС] 5
Я проверял для русского и для английского.
Так вот из того что я понял, есть какая то разница между ПОРЯДКОВОЙ СОРТИРОВКОЙ И ЛЕКСИКОГРАФИЧЕСКОЙ.
И мне кажется, что как в русском, так и в английском языке - это одно и тоже.

Функция strxfrm преобразует строку таким образом, чтобы можно было потом использовать ее с функциями, которые работают на основе порядковой сортировки.
А если это одно и то же, то смысла нет. Значит эта функция для каких-то специфических языков, ну вот мне так кажется.
Поэтому, может быть я и не вижу разницу.
0
7084 / 6085 / 2774
Регистрация: 14.04.2014
Сообщений: 26,174
16.12.2017, 12:07 6
А русский не специфический? Ещё раз прочитай про Ё в моём сообщении.
Английский как раз не показателен из-за своей примитивной орфографии - там, возможно, и не будет разницы.
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
16.12.2017, 15:10  [ТС] 7
Цитата Сообщение от nmcf Посмотреть сообщение
А русский не специфический? Ещё раз прочитай про Ё в моём сообщении.
Да проверял все.
Вот код проверки:

C++
1
2
3
4
5
6
7
8
cout << strcmp("ёлка", "палка") << endl;
cout << strcoll("ёлка", "палка") << endl;
char a[10];
char b[10];
strxfrm(a, "ёлка", 5);
strxfrm(b, "палка", 5);
cout << strcmp(a, b) << endl;
cout << strcoll(a, b) << endl;
Все четыре вывода дают -1.
Такое ощущение, что буква Ё в этой кодировке идет сразу после Е.

Правда у меня файл сам сохранен в кодировке cp866.

Добавлено через 24 минуты
Предыдущий пример понятно почему давал такие результаты. Он был в кодировке C.

А вот этот пример

C++
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
auto main(int argc, char * argv[]) -> int
{
    setlocale(LC_COLLATE, "RU_ru");
    setlocale(LC_CTYPE, "RU_ru");
    
 
    char source1[10] = "ёлка";
    char source2[10] = "палка";
 
    cout << source1 << endl;
    cout << source2 << endl;
 
    cout << strcmp(source1, source2) << endl;
    cout << strcoll(source1, source2) << endl;
 
    char dest1[20];
    char dest2[20];
 
    strxfrm(dest1, source1, 10);
    strxfrm(dest2, source2, 10);
 
    cout << dest1 << endl;
    cout << dest2 << endl;
 
    cout << strcmp(dest1, dest2) << endl;
    cout << strcoll(dest1, dest2) << endl;
 
    
    
    system("pause");
    return EXIT_SUCCESS;
}
Дает все 4 единицы. Интересно, а как настроить букву Ё, чтобы она правильно шла.

Добавлено через 1 час 50 минут
А вообще, что-то меня наталкивает на мысль, что консоль Windows - это не то место, чтобы тестировать такие функции.
0
7084 / 6085 / 2774
Регистрация: 14.04.2014
Сообщений: 26,174
16.12.2017, 17:57 8
Какой у тебя компилятор? В VS работает, только слова на Ё не выделяются в свою группу, а идут вместе со словами на Е. Получается "ёлка" < "елками", но "ёлка" > "елка".

Добавлено через 1 минуту
Цитата Сообщение от Просто Саша Посмотреть сообщение
консоль Windows - это не то место, чтобы тестировать такие функции
Причём тут консоль? Ты выводишь только результат сравнения.
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
16.12.2017, 22:50  [ТС] 9
Цитата Сообщение от nmcf Посмотреть сообщение
Какой у тебя компилятор?
У меня Visual Studio 2017

Ничего оно не работает.
А если точнее, когда кодовая страница 866 то выдает все четыре единицы, а когда 1251, то все четыре -1.

Кажется, что эти функции вообще не рассчитаны на работу с русским текстом.
Они же работают с типом char, а Вы можете проверить, что в C++ он знаковый.
0
7084 / 6085 / 2774
Регистрация: 14.04.2014
Сообщений: 26,174
16.12.2017, 23:06 10
Ты неправильно устанавливаешь локаль.
C++
1
2
3
4
5
6
setlocale(LC_COLLATE, "rus_rus.1251");
setlocale(LC_COLLATE, ""); // для русской версии Windows.
 
char source1[10] = "ёлка";
char source2[10] = "палка";
cout << strcoll(source1, source2) << endl; // -1
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
17.12.2017, 07:29  [ТС] 11
Цитата Сообщение от nmcf Посмотреть сообщение
Ты неправильно устанавливаешь локаль.
Здесь Вы получаете правильный результат только потому что в кодовой странице 1251 буква Ё меньшее значение.
Попробуйте вместо слова палка использовать слово белка и Вы тоже получите -1.

То же самое, что и в 866, только с точностью до наоборот.

Добавлено через 18 минут
У меня работает правильно и с белкой и с палкой правильно только вот в таком варианте:

C++
1
2
3
4
5
6
7
8
_locale_t locale;
locale = _create_locale(LC_ALL, "Russian_Russia.866");
 
char source1[10] = "ёлка";
char source2[10] = "палка";
cout << _strcoll_l(source1, source2, locale) << endl;
 
_free_locale(locale);
но только в том случае, когда я сохраняю данный файл в кодировке 866.

Аналогичным образом, и этот код работает правильно

C++
1
2
3
4
5
6
7
8
9
_locale_t locale;
locale = _create_locale(LC_ALL, "Russian_Russia.1251");
 
 
char source1[10] = "ёлка";
char source2[10] = "палка";
cout << _strcoll_l(source1, source2, locale) << endl;
 
_free_locale(locale);
но только тогда, когда я сохраняю данный файл в кодировке 1251.
0
7084 / 6085 / 2774
Регистрация: 14.04.2014
Сообщений: 26,174
17.12.2017, 14:02 12
Цитата Сообщение от Просто Саша Посмотреть сообщение
Попробуйте вместо слова палка использовать слово белка и Вы тоже получите -1.
У меня strcoll() выводит 1 и для 1251, и для 866.
VS 2013.
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
17.12.2017, 20:15  [ТС] 13
Цитата Сообщение от nmcf Посмотреть сообщение
У меня strcoll() выводит 1 и для 1251, и для 866.
VS 2013.
Понятно. Вам спасибо большое. Тут я понял, что эти функции не так то просто использовать с русским языком, например даже простые функции toupper и tolower отказываются работать с русским языком. А вот их варианты, в котором одним из параметров является локаль уже работают.
Очень досадно, что так с русским языком.
А вот пиндосам крупно повезло, что им не надо напрягаться по этому поводу.
0
7084 / 6085 / 2774
Регистрация: 14.04.2014
Сообщений: 26,174
17.12.2017, 21:21 14
И toupper() нормально работает.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2017, 21:21

Какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()?
какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()

Выясните, сохраняет ли булева функция 0, 1, является ли функция линейной, монотонной, само двойственной?
Помогите пожалуйста!!! Булева функция задана вектором значений F(x)=(1001) Выясните, сохраняет...

Функция - Pos(s,s1). Назначение - поиск первого вхождения подстроки s1 в строку s (аналогичная функция C - strstr)
Функция - Pos(s,s1). Назначение - поиск первого вхождения подстроки s1 в строку s (аналогичная...

СУММЕСЛИМН + оператор сравнения+ функция МЕСЯЦ + функция ГОД
Нужно описать функцию вида =СУММЕСЛИМН(K:K;L:L;И(месяц(q1)&gt;=месяц(L2);год(q1)&gt;=год(l2)) выдает...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.