Форум программистов, компьютерный форум CyberForum.ru

Перевод строк в верхний и нижний регистры не работает для кириллицы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Troo
1 / 1 / 0
Регистрация: 09.10.2013
Сообщений: 73
07.01.2014, 20:49     Перевод строк в верхний и нижний регистры не работает для кириллицы #1
Для того, чтобы в программе можно было осуществлять различные действия вне
зависимости от регистра, используются специальные функции tolower(c) и
toupper(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
33
34
35
36
37
38
39
40
#include<iostream>
#include <string>
#include<math.h>
#include<windows.h>
#include<string.h>
#include<stdio.h>
 
using namespace std;
 
char bufRus[256];
 
char* Rus(const char* text) {
      CharToOem(text, bufRus);
      return bufRus;
      }
char* Rtolower (char *s);
char* Rtoupper (char *s);
 
 
int main()
{
    char s[40];
    cin.getline(s,40);
    cout << '\n';
    cout << Rtolower(s) <<endl;
    cout << Rtoupper(s) <<endl;
    return 0;
}
char* Rtolower (char *s)
{
    for (int i=0;i<strlen(s);i++)
    if (s[i]<-32 && s[i]>-65) s[i]=s[i]+32;
    return s;
}
char* Rtoupper (char *s)
{
    for (int i=0;i<strlen(s);i++)
    if (s[i]<0 && s[i]>-33) s[i]=s[i]-32;
    return s;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2014, 20:49     Перевод строк в верхний и нижний регистры не работает для кириллицы
Посмотрите здесь:

Перевод букв в нижний регистр C++
C++ Перевод с кириллицы на русский
Строки в С++. Верхний и нижний регистр C++
Преобразование строки сначала в верхний регистр, потом в нижний C++
C++ Верхний и нижний регистр
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TrueBit
 Аватар для TrueBit
95 / 95 / 12
Регистрация: 19.11.2012
Сообщений: 195
07.01.2014, 21:56     Перевод строк в верхний и нижний регистры не работает для кириллицы #2
У меня ваш код не работает(Visual Studio 2008):

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
33
34
35
36
37
38
39
#include<iostream>
using namespace std;
 
 
char* Rtolower (char *s);
char* Rtoupper (char *s);
 
 
int main() {
    char s[40];
    cin.getline(s,40);
    cout << '\n';
    
    cout << Rtolower(s) <<endl;
    cout << Rtoupper(s) <<endl;
    return 0;
}
char* Rtolower (char *s)
{
    for (int i=0;i<(int)strlen(s);i++)
        if (-128<=s[i] && s[i]<=-113) // rus1
            s[i]+=32;
        else if(-112<=s[i] && s[i]<=-97) // rus2
            s[i]+=80;
        else if(65<=s[i] && s[i]<=90) // en
            s[i]+=32;
    return s;
}
char* Rtoupper (char *s)
{
    for (int i=0;i<(int)strlen(s);i++)
        if ((-128+32)<=s[i] && s[i]<=(-113+32)) // rus1
            s[i]-=32;
        else if((-112+80)<=s[i] && s[i]<=(-97+80)) // rus2
            s[i]-=80;
        else if((65+32)<=s[i] && s[i]<=(90+32)) // en
            s[i]-=32;
    return s;
}
Убежденный
Системный программист
 Аватар для Убежденный
14193 / 6208 / 985
Регистрация: 02.05.2013
Сообщений: 10,345
Завершенные тесты: 1
08.01.2014, 00:23     Перевод строк в верхний и нижний регистры не работает для кириллицы #3
Цитата Сообщение от Troo Посмотреть сообщение
Однако эти функции работают лишь для букв латинского алфавита.
Используйте toupper/tolower из <locale>.
Они выполняют преобразование регистра символов согласно заданной локализации.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.01.2014, 08:46     Перевод строк в верхний и нижний регистры не работает для кириллицы #4
C++
1
2
3
4
5
int main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
...
В свойствах консоли выбрать шрифт Lucida Console
Troo
1 / 1 / 0
Регистрация: 09.10.2013
Сообщений: 73
08.01.2014, 18:10  [ТС]     Перевод строк в верхний и нижний регистры не работает для кириллицы #5
TrueBit, а объясните пожалуйста почему именно такие функции

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
char* Rtolower (char *s)
{
    for (int i=0;i<(int)strlen(s);i++)
        if (-128<=s[i] && s[i]<=-113) // rus1
            s[i]+=32;
        else if(-112<=s[i] && s[i]<=-97) // rus2
            s[i]+=80;
        else if(65<=s[i] && s[i]<=90) // en
            s[i]+=32;
    return s;
}
char* Rtoupper (char *s)
{
    for (int i=0;i<(int)strlen(s);i++)
        if ((-128+32)<=s[i] && s[i]<=(-113+32)) // rus1
            s[i]-=32;
        else if((-112+80)<=s[i] && s[i]<=(-97+80)) // rus2
            s[i]-=80;
        else if((65+32)<=s[i] && s[i]<=(90+32)) // en
            s[i]-=32;
    return s;
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,416
08.01.2014, 18:18     Перевод строк в верхний и нижний регистры не работает для кириллицы #6
towlower, towupper

Добавлено через 43 секунды
Кстати, в линуксах работает и tolower, toupper.
TrueBit
 Аватар для TrueBit
95 / 95 / 12
Регистрация: 19.11.2012
Сообщений: 195
08.01.2014, 18:27     Перевод строк в верхний и нижний регистры не работает для кириллицы #7
Цитата Сообщение от Troo Посмотреть сообщение
TrueBit, а объясните пожалуйста почему именно такие функции

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
char* Rtolower (char *s)
{
    for (int i=0;i<(int)strlen(s);i++)
        if (-128<=s[i] && s[i]<=-113) // rus1
            s[i]+=32;
        else if(-112<=s[i] && s[i]<=-97) // rus2
            s[i]+=80;
        else if(65<=s[i] && s[i]<=90) // en
            s[i]+=32;
    return s;
}
char* Rtoupper (char *s)
{
    for (int i=0;i<(int)strlen(s);i++)
        if ((-128+32)<=s[i] && s[i]<=(-113+32)) // rus1
            s[i]-=32;
        else if((-112+80)<=s[i] && s[i]<=(-97+80)) // rus2
            s[i]-=80;
        else if((65+32)<=s[i] && s[i]<=(90+32)) // en
            s[i]-=32;
    return s;
}
исходя из значений 866 кодовой страницы ASCII кодов ( http://www.krles.ru/images/ad/ascii.pdf )

Вот можете по экспериментировать(если использовать без знаковый тип: unsigned char, то таблица будет полностью соответствовать, если знаковый то все символы после 127 будет начинаться с максимального отрицательного и до 0):

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream> 
#include <limits>
using namespace std;
 
int main() {
    /*for(int i=0; i<(int)numeric_limits<=unsigned char>::max(); i++)
        printf("[%3d] = %c\n",i,unsigned char(i));*/
    for(int i=numeric_limits<char>::min(); i<=(int)numeric_limits<char>::max(); i++)
        printf("[%3d] = %c\n",i,char(i));
}
кодовая таблица приложена к сообщению
Миниатюры
Перевод строк в верхний и нижний регистры не работает для кириллицы  
Troo
1 / 1 / 0
Регистрация: 09.10.2013
Сообщений: 73
08.01.2014, 18:35  [ТС]     Перевод строк в верхний и нижний регистры не работает для кириллицы #8
TrueBit,
вот смотрю таблицу
http://cppstudio.com/uchebniki/yazyk...tablica-ascii/

не понимаю этих строк:
C++
1
2
3
4
if (-128<=s[i] && s[i]<=-113) // rus1
            s[i]+=32;
        else if(-112<=s[i] && s[i]<=-97) // rus2
            s[i]+=80;
C++
1
2
3
4
if ((-128+32)<=s[i] && s[i]<=(-113+32)) // rus1
            s[i]-=32;
        else if((-112+80)<=s[i] && s[i]<=(-97+80)) // rus2
            s[i]-=80;
Добавлено через 5 минут
TrueBit, Почему -113
TrueBit
 Аватар для TrueBit
95 / 95 / 12
Регистрация: 19.11.2012
Сообщений: 195
08.01.2014, 18:58     Перевод строк в верхний и нижний регистры не работает для кириллицы #9
Цитата Сообщение от Troo Посмотреть сообщение
Почему -113
Потому, что тип знаковый char(-113) тоже самое, что unsigned char(143). Войдите в калькулятор win+r calc. Вид-программист. Введите выберите размер 2 байта, введите 143 получится 10001111 бит последовательность, выберите размер 1 байт. Получится та же последовательность 10001111. Просто при использовании знакового типа старший разряд 1 байта используется под знак, а оставшиеся 7 бит используются под число. Поэтому число -113 знаковое и 143 без знаковое хранятся одинакого (таблицу для без знаковых можете посмотреть выше).

Вот переписал функцию, под без знаковый тип, чтобы она полностью соответствовала таблице кодов с диапазаном значений от 0 до 255

C++
1
2
3
4
5
6
7
8
9
10
11
char* Rtolower (char *s)
{
    for (int i=0;i<(int)strlen(s);i++)
        if (128<=(unsigned char)s[i] && (unsigned char)s[i]<=143) // если символ лежит в диапазан [128,143] - тоесть большие буквы
            s[i]+=32; // то переводим в другой диапазон [160,175] (маленькие буквы)
        else if(144<=(unsigned char)s[i] && (unsigned char)s[i]<=159) // тут вторая часть больших букв, потому, что продолжение(вторая половина)
            s[i]+=80; // маленьких букв находится чуть дальше, через 80 символов от больших
        else if(65<=s[i] && s[i]<=90) // en
            s[i]+=32;
    return s;
}
Добавлено через 12 минут
То есть если рассматривать эти 8 бит как знаковые числа(от -128 до 127), то один бит для знака(1000 0000 либо 1000 0000), остальные под число(от 000 0000 до 111 1111 ). Если рассматривать как без знаковый(от 0 до 255), то отрицательных нет и все первые 127 положительных чисел одинаковые ( 0111 1111 = 127 максимальное положительное знаковое, 0111 1111 = 127 положительное без знаковое). А дальше ( 1000 0000 - тут начинается отрицательные знаковые, а тут 1000 000 - следующее положительное без знаковое). Но с точки зрения символа это одно и то же.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2014, 18:58     Перевод строк в верхний и нижний регистры не работает для кириллицы
Еще ссылки по теме:

Кроссплатформенный перевод русских букв в верхний/нижний регистр C++
C++ Перевод в нижний регистр
C++ Перевод символов в верхний/нижний регистры

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

Или воспользуйтесь поиском по форуму:
Troo
1 / 1 / 0
Регистрация: 09.10.2013
Сообщений: 73
08.01.2014, 18:58  [ТС]     Перевод строк в верхний и нижний регистры не работает для кириллицы #10
TrueBit, спасибо большое
Yandex
Объявления
08.01.2014, 18:58     Перевод строк в верхний и нижний регистры не работает для кириллицы
Ответ Создать тему
Опции темы

Текущее время: 22:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru