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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.70
Somilya
3 / 3 / 0
Регистрация: 19.01.2013
Сообщений: 10
#1

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

24.08.2013, 16:19. Просмотров 5001. Ответов 12
Метки нет (Все метки)

Эти три функции не хотят нормально работать с кириллицей. Если им скормить американские литеры, все нормально. Но вот, например, эта программа печатает "тест", а по-идее должна "ТЕСТ".

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 и кириллица (C++):

Подсчитать количество вхождений буквы (кириллица) в строку (кириллица) - C++
Суть такая: по требованию программы ввести строку символов (обыкновенный текст, кириллица(!!!)) и посчитать количество вхождений, если...

функция tolower() - C++
Необходимо изменить регистр на нижний. Как только не пробовал не получается. Получается если я задаю строку заранее, что на русском что...

Использование toupper() - C++
Не знаю почему, но код не хочет работать, вроде уже всё прописал что нужно. Программа должна выдать на экран фразу: украина - лучшая страна...

Как реализовать tolower()? - C++
Подскажите, пожалуйста, как применить функцию tolower() к переменной типа vector&lt;int&gt;::size_type Вот фрагмент кода, приводящий к ошибке:...

Toupper() для char16_t - C++
Здравствуйте. Почему-то не могу найти аналог toupper() для char16_t. В каком он заголовке и как называется функция?

Tolower для русских букв - C++
Есть символьный массив с русскими буквами: &quot;Сегодня Прекрасная Погода&quot;. Мне нужно заглавные буквы изменить с верхнего регистра на нижний....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.08.2013, 16:20 #2
Кэп. В чем вопрос?
Somilya
3 / 3 / 0
Регистрация: 19.01.2013
Сообщений: 10
24.08.2013, 16:21  [ТС] #3
Как преобразовать строку в заглавные буквы (и наоборот). Я в C++ ноль.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.08.2013, 16:22 #4
Цитата Сообщение от Somilya Посмотреть сообщение
Так как проблему решить? Как преобразовать строку в заглавные буквы (и наоборот). Я в C++ ноль.
Без использования этих функций.
Somilya
3 / 3 / 0
Регистрация: 19.01.2013
Сообщений: 10
24.08.2013, 16:23  [ТС] #5
Это я уже понял.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.08.2013, 16:32 #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  [ТС] #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 #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  [ТС] #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 #10
Не Винда? setlocale(LC_ALL, ""); С g++ не знаком
Somilya
3 / 3 / 0
Регистрация: 19.01.2013
Сообщений: 10
24.08.2013, 17:14  [ТС] #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
0 / 0 / 0
Регистрация: 22.11.2014
Сообщений: 2
22.11.2014, 09:02 #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;
}
nmcf
5310 / 4630 / 1550
Регистрация: 14.04.2014
Сообщений: 18,437
22.11.2014, 10:54 #13
Как я уже писал, в Linux строка char - это строка utf8, поэтому индексирование не даёт доступ к буквам и соотвественно функции типа toupper() не работают.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2014, 10:54
Привет! Вот еще темы с ответами:

Функции tolower,islower,isupper - C++
Если кто знаком с функциями tolower,islower,isupper, дайте пожалуйста с каждой примитивный пример с маленьким коментом, как их...

Dev c++, компилятор не понимает функцию toupper() - C++
Короче, вот такая штука; когда хотел использовать функцию touper(), заголовка &lt;cctype&gt;, компилятор эту функцию воспринимает за переменную(...

Найти первые вхождения символов (функции strchr(), tolower()) - C++
В массиве строк , введенных пользователем , найти первые вхождения символов ' s ' и 'S' . Использовать функции strchr ( ) , tolower ( ) .

Существует ли эквивалент функции toupper() для типа string ? - C++
Существует ли эквивалент функции toupper(), предназначенной для типа char, что - нибудь подобное для типа string ?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.11.2014, 10:54
Ответ Создать тему
Опции темы

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