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

Tolower для русских букв - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Dragon.007
 Аватар для Dragon.007
3 / 3 / 0
Регистрация: 06.04.2012
Сообщений: 29
09.05.2014, 14:18     Tolower для русских букв #1
Есть символьный массив с русскими буквами: "Сегодня Прекрасная Погода". Мне нужно заглавные буквы изменить с верхнего регистра на нижний. функция tolower почему-то не работает..
Хотя на другом коде всё прекрасно с русскими буквами..

Вот собственно код, если нужно.
Кликните здесь для просмотра всего текста
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.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
#include <locale.h>
void main()
{
setlocale(LC_ALL, "Russian_Russia.1251");
clrscr();
char str[52]="Сегодня прекрасный солнечный день! Пошли купаться?", str2[51], buf=0;
char alf[33]="абвгдежзийклмнопростуфхцчшщъыьэюя", alf2[33]="гдойбжвтуфпэсашезюрщкцьимылчхянъ"; 
int prov[26]={0},k=0;
 
  for (int i=0; i<51; i++)
  {if(ispunct(str[i]) || str[i]==' ') {str2[i]=str[i];continue;}
   buf=str[i];
   buf=tolower(buf);
   for (int j=0; j<32; j++)
     if(buf==alf[j])
     {str2[i]=alf2[j]; break;}
  }
for(i=0; i<50; i++)
  cout<<str[i];
cout<<"\n";
for(i=0; i<50; i++)
  cout<<str2[i];
 
 
float s=0,k2, n=44;
for (i=0; i<32; i++) 
{for(int j=0; j<n; j++) 
if (alf[i]==str2[j]) k2++; 
s+=(k2*(k2-1))/(n*(n-1)); 
k2=0;} 
 
cout<<"\nsumma = "<<s;
getch();
return;
}


Компилируется он так:
Tolower для русских букв

И еще... Почему-то пропадает также буква "я", но это скорее всего я где-то не доглядела.
_______________________________________________________________________
По повод буквы "я" исправила. Вопрос про регистр все еще в силе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
09.05.2014, 14:24     Tolower для русских букв #2
Функция tolower правильно поддерживает только англ язык. Попробуйте написать свой tolower
Dragon.007
 Аватар для Dragon.007
3 / 3 / 0
Регистрация: 06.04.2012
Сообщений: 29
09.05.2014, 14:29  [ТС]     Tolower для русских букв #3
Praud, в том то и загвоздка, что в другой программе toupper (почти tolower) поддерживает русский и прекрасно работает О_о Это и удивляет.
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
09.05.2014, 14:46     Tolower для русских букв #4
Дело в том, что эти функции работают непосредственно с ASCII кодом и далеко не все русские буквы попадают в этот спектр, который определен в функции. Из-за этого возникают проблемы.
Скорее всего, ваша функция toupper не так уж и идеально работает
Dragon.007
 Аватар для Dragon.007
3 / 3 / 0
Регистрация: 06.04.2012
Сообщений: 29
09.05.2014, 15:03  [ТС]     Tolower для русских букв #5
Praud, хм, вполне возможно, но ни разу нареканий не было вроде. Спасибо за отклик, будем писать свою функцию )
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
09.05.2014, 15:27     Tolower для русских букв #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <windows.h> //для CharLower
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"");
  char buffer[255]="Сегодня прекрасный солнечный день! Пошли купаться?";
    char *rez;
 
    rez=CharLower(buffer);
 
    cout << rez << endl;
}
Dragon.007
 Аватар для Dragon.007
3 / 3 / 0
Регистрация: 06.04.2012
Сообщений: 29
09.05.2014, 15:34  [ТС]     Tolower для русских букв #7
daslex, благодарю за отклик, но увы в моем Borland C++ не поддерживается такой вариант.. Я пыталась =)

Добавлено через 3 минуты
Написала вот такую функцию. Это легче всех мучений )
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
int MyToLower( char r)
{
 switch (r)
 {
 case 'А': r='а'; break;
 case 'Б': r='б'; break;
 case 'В': r='в'; break;
 case 'Г': r='г'; break;
 case 'Д': r='д'; break;
 case 'Е': r='е'; break;
 case 'Ж': r='ж'; break;
 case 'З': r='з'; break;
 case 'И': r='и'; break;
 case 'Й': r='й'; break;
 case 'К': r='к'; break;
 case 'Л': r='л'; break;
 case 'М': r='м'; break;
 case 'Н': r='н'; break;
 case 'О': r='о'; break;
 case 'П': r='п'; break;
 case 'Р': r='р'; break;
 case 'С': r='с'; break;
 case 'Т': r='т'; break;
 case 'У': r='у'; break;
 case 'Ф': r='ф'; break;
 case 'Х': r='х'; break;
 case 'Ц': r='ц'; break;
 case 'Ч': r='ч'; break;
 case 'Ш': r='ш'; break;
 case 'Щ': r='щ'; break;
 case 'Ъ': r='ъ'; break;
 case 'Ы': r='ы'; break;
 case 'Ь': r='ь'; break;
 case 'Э': r='э'; break;
 case 'Ю': r='ю'; break;
 case 'Я': r='я'; break;
 }
 return (r);

и везде пишу только: buf = MyToLower(buf);
nmcf
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,536
09.05.2014, 17:30     Tolower для русских букв #8
А буква "ё" почему отсутствует?
Используй лучше VS, там есть консольные приложения. Этот Borland для DOS из прошлого века.
Atomx86
39 / 7 / 0
Регистрация: 09.05.2014
Сообщений: 9
09.05.2014, 18:13     Tolower для русских букв #9
используйте MSVS2013
Dragon.007
 Аватар для Dragon.007
3 / 3 / 0
Регистрация: 06.04.2012
Сообщений: 29
09.05.2014, 18:46  [ТС]     Tolower для русских букв #10
nmcf, Atomx86, я бы с радостью, да у нас в университете мы работаем по такой программе, увы.
По поводу буквы ё- в задании было сказано 32 буквы, решила убрать её.
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,662
10.05.2014, 10:42     Tolower для русских букв #11
Можно обойтись стандартными средствами:
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
41
42
#include <algorithm>
#include <conio.h>
#include <functional>
#include <iostream>
#include <locale>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
char  tolower_rus( char c )
{
    return  tolower
                (
                    c,
                    std::locale("")
                );
}
/////////////////////////////////////////////////////////////////////////////////////////
T_str  string_tolower_rus( const T_str&  str )
{
    T_str   res_str     =   str;
        
    std::transform
        (
            str.begin       (),
            str.end         (),
            res_str.begin   (),
            tolower_rus
        );
 
    return  res_str;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    T_str   s   =   "Сегодня прекрасный солнечный день! Пошли купаться?";
 
    std::cout   <<  string_tolower_rus(s)
                <<  std::endl;
    getch();
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.05.2014, 10:57     Tolower для русских букв #12
Mr.X, что-то не работает http://ideone.com/1Ts0r2
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
10.05.2014, 11:38     Tolower для русских букв #13
Tulosba, в шиндоусе работает (VS'12).
В ideone пробовал подбирать различные варианты локалей, но на всех бросает исключение. Интересно, на какой системе у них запускаются программы?
Миниатюры
Tolower для русских букв  
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.05.2014, 00:01     Tolower для русских букв #14
Цитата Сообщение от iRomul Посмотреть сообщение
в шиндоусе работает (VS'12).
В русском? А как будет в забугорном? В коде же нет явного упоминания русской локали.

Цитата Сообщение от iRomul Посмотреть сообщение
Интересно, на какой системе у них запускаются программы?
Там линукс какой-то. Но по ходу набор локалей не большой.
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
12.05.2014, 00:06     Tolower для русских букв #15
Даже если поставить "Rus" или "Russian" - всё равно работает.
Миниатюры
Tolower для русских букв  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2014, 00:09     Tolower для русских букв
Еще ссылки по теме:

C++ Программа для вывода русских букв
C++ Какая используется для русских букв в Dev-C++
C++ Ввод русских букв

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.05.2014, 00:09     Tolower для русских букв #16
Цитата Сообщение от iRomul Посмотреть сообщение
Даже если поставить "Rus" или "Russian" - всё равно работает.
Я не о том всё же. Я про запуск кода Mr.X на английской винде например.
Yandex
Объявления
12.05.2014, 00:09     Tolower для русских букв
Ответ Создать тему
Опции темы

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