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

toupper, tolower, strlen и кириллица - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.70
Somilya
3 / 3 / 0
Регистрация: 19.01.2013
Сообщений: 10
24.08.2013, 16:19     toupper, tolower, strlen и кириллица #1
Эти три функции не хотят нормально работать с кириллицей. Если им скормить американские литеры, все нормально. Но вот, например, эта программа печатает "тест", а по-идее должна "ТЕСТ".

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Преобразование строчных символов в заглавные.
 
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
 
int main()
{
    char str[80];
    int i;
    
    strcpy(str, "тест");
    
    for (i = 0; str[i]; i++)
        str[i] = toupper(str[i]);
    
    cout << str << endl;
    
    return 0;
}
Также strlen("тест!") возвращает девять символов (каждый русский считается за два). Компилятор g++.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2013, 16:19     toupper, tolower, strlen и кириллица
Посмотрите здесь:

Использование toupper() C++
C++ Функции tolower,islower,isupper
C++ функция tolower()
Как реализовать tolower()? C++
Существует ли эквивалент функции toupper() для типа string ? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.08.2013, 16:20     toupper, tolower, strlen и кириллица #2
Кэп. В чем вопрос?
Somilya
3 / 3 / 0
Регистрация: 19.01.2013
Сообщений: 10
24.08.2013, 16:21  [ТС]     toupper, tolower, strlen и кириллица #3
Как преобразовать строку в заглавные буквы (и наоборот). Я в C++ ноль.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.08.2013, 16:22     toupper, tolower, strlen и кириллица #4
Цитата Сообщение от Somilya Посмотреть сообщение
Так как проблему решить? Как преобразовать строку в заглавные буквы (и наоборот). Я в C++ ноль.
Без использования этих функций.
Somilya
3 / 3 / 0
Регистрация: 19.01.2013
Сообщений: 10
24.08.2013, 16:23  [ТС]     toupper, tolower, strlen и кириллица #5
Это я уже понял.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.08.2013, 16:32     toupper, tolower, strlen и кириллица #6
C++
1
2
3
4
5
6
7
8
9
10
11
int _tmain(int argc, _TCHAR* argv[])
  {
  setlocale(LC_ALL, "Russian");
  wchar_t str[80];
  wcscpy_s(str, L"тест");
  std::wcout << str << endl; 
  for (size_t i = 0; str[i]; ++i)
    str[i] = towupper(str[i]);
  std::wcout << str << endl;
  return 0;
  }
Somilya
3 / 3 / 0
Регистрация: 19.01.2013
Сообщений: 10
24.08.2013, 16:44  [ТС]     toupper, tolower, strlen и кириллица #7
ошибка: нет декларации «wcscpy_s» в этой области видимости

setlocale, wcout и towupper() компилирует

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Преобразование строчных символов в заглавные.
 
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    wchar_t str[80];
    wcscpy_s(str, L"тест"); // ошибка компиляции
    
    for (int i = 0; str[i]; i++)
        str[i] = towupper(str[i]);
    
    wcout << str << endl;
    
    return 0;
}
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.08.2013, 16:47     toupper, tolower, strlen и кириллица #8
Цитата Сообщение от Somilya Посмотреть сообщение
ошибка: нет декларации «wcscpy_s» в этой области видимости
Мб фишка вижуал студии. string.h/wchar.h. Замени на http://www.cplusplus.com/reference/cwchar/wcscpy/
Somilya
3 / 3 / 0
Регистрация: 19.01.2013
Сообщений: 10
24.08.2013, 17:02  [ТС]     toupper, tolower, strlen и кириллица #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cstring>
#include <cctype>
#include <wchar.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    wchar_t str[80];
    wcscpy(str, L"тест"); // А не wcscpy_s
    ...
    wcout << str << endl;
    
    return 0;
Выдает "????"

Добавлено через 10 минут
Короче, до юникода я не дорос.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.08.2013, 17:05     toupper, tolower, strlen и кириллица #10
Не Винда? setlocale(LC_ALL, ""); С g++ не знаком
Somilya
3 / 3 / 0
Регистрация: 19.01.2013
Сообщений: 10
24.08.2013, 17:14  [ТС]     toupper, tolower, strlen и кириллица #11
Цитата Сообщение от Nekto Посмотреть сообщение
Не Винда?
Неа, линукс.

Цитата Сообщение от Nekto Посмотреть сообщение
setlocale(LC_ALL, "");
Огромное спасибо, работает!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Преобразование строчных символов в заглавные.
 
#include <iostream>
#include <wchar.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "");
    wchar_t str[80];
    wcscpy(str, L"тест");
    
    for (int i = 0; str[i]; i++)
        str[i] = towupper(str[i]);
    
    wcout << str << endl;
    
    return 0;
}
John_1510
 Аватар для John_1510
0 / 0 / 0
Регистрация: 22.11.2014
Сообщений: 2
22.11.2014, 09:02     toupper, tolower, strlen и кириллица #12
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
#include "stdafx.h"
 
using namespace std;
 
char* funcToUpper(char *ch, int len);
 
int main(int argc, char* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    char c[80];
    gets_s(c);
    char *ch = funcToUpper(c, strlen(c));
    cout << ch;
 
    return 0;
}
 
char* funcToUpper(char *ch, int len)
{
    for(int i=0; i<len; i++) {
        *(ch+i) = *(ch+i)-32;
    }
    return ch;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2014, 10:54     toupper, tolower, strlen и кириллица
Еще ссылки по теме:

C++ Tolower для русских букв
C++ Dev c++, компилятор не понимает функцию toupper()
Подсчитать количество вхождений буквы (кириллица) в строку (кириллица) C++

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

Или воспользуйтесь поиском по форуму:
nmcf
4270 / 3701 / 1246
Регистрация: 14.04.2014
Сообщений: 14,493
22.11.2014, 10:54     toupper, tolower, strlen и кириллица #13
Как я уже писал, в Linux строка char - это строка utf8, поэтому индексирование не даёт доступ к буквам и соотвественно функции типа toupper() не работают.
Yandex
Объявления
22.11.2014, 10:54     toupper, tolower, strlen и кириллица
Ответ Создать тему
Опции темы

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