Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 11

Не работает перевод в верхний регистр с русскими буквами

09.02.2018, 17:22. Показов 4103. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не работает перевод в верхний регистр с русскими буквами в VS
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <cctype>
#include <Windows.h>
using namespace std;
int main()
{
    //Подготовка
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    const int MAX_WRONG = 8;
    vector<string> words;
    words.push_back("ОГОНЬ");
    words.push_back("МОЛОКО");
    words.push_back("ЗАМОК");
    words.push_back("СОБАКА");
    words.push_back("ДОРОГА");
    words.push_back("КОШКА");
    srand(static_cast<unsigned int>(time(0)));
    random_shuffle(words.begin(), words.end());
    const string THE_WORD = words[0];
    int wrong = 0;
    string soFar(THE_WORD.size(), '-');
    string used = "";
    cout << "\nДобро пожаловать в 'Виселицу'. Удачи.\n";
    //Основной цикл
    while ((wrong < MAX_WRONG) && (soFar != THE_WORD))
    {
        cout << "\n\nОставшиеся попытки:" << (MAX_WRONG - wrong);
        cout << "\n\nВы использовали следующие буквы:\n " << used << endl;
        cout << "\nПока что, слово:\n" << soFar << endl;
        char guess;
        cout << "\nВведите букву: ";
        cin >> guess;
        guess = toupper(guess);//Перевод в верхний регистор,т.к загаданное слово записано в верхнем регистре
        while (used.find(guess) != string::npos)
        {
            cout << "\nВы уже вводили "<<guess<<endl;
            cout << "Введите букву: ";
            cin >> guess;
            guess = toupper(guess);
        }
        used += guess;
        if (THE_WORD.find(guess) != string::npos)
        {
            cout << "Это верно! " << guess << " есть в слове.\n";
            for (int i = 0; i < THE_WORD.length(); ++i)
            {
                if (THE_WORD[i] == guess)
                {
                    soFar[i] = guess;
                }
            }
        }
        else
        {
            cout << "Прости,буквы " << guess << " нет в слове.\n";
            ++wrong;
        }
    }
    //Конец игры
    if (wrong == MAX_WRONG)
    {
        cout << "\nПодвесили лошару!";
    }
    else
    {
        cout << "\nВай вай вай, какой красавчик, могешь, отгадал!!!";
    }
    cout << "\nЭто слово " << THE_WORD << endl;
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.02.2018, 17:22
Ответы с готовыми решениями:

Перевод строки в верхний регистр (не работает с кириллицей)
Изменяет регистр всех букв строки на верхний (буквы латинского алфавита и кириллицы в кодировке 866). Возвращаемое значение: количество...

Перевод в верхний регистр
В заданной строке надо перевести первую букву каждого слова в верхний регистр. Разделителями слов являются пробелы и знаки препинания....

Перевод строки в верхний регистр
как заменить маленькие буквы на большие буквы

10
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
09.02.2018, 18:23
Code review

Цитата Сообщение от DRONCSKA Посмотреть сообщение
vector<string> words;
* * words.push_back("ОГОНЬ");
* * words.push_back("МОЛОКО");
* * words.push_back("ЗАМОК");
* * words.push_back("СОБАКА");
* * words.push_back("ДОРОГ
Цитата Сообщение от DRONCSKA Посмотреть сообщение
words[0]
А");
* * words.push_back("КОШКА");
C++
1
std::vector<std::string> words{"ОГОНЬ", "МОЛОКО" /* , ... */ };
Цитата Сообщение от DRONCSKA Посмотреть сообщение
words[0]
C++
1
words.front()
Цитата Сообщение от DRONCSKA Посмотреть сообщение
cout << "\n\nОставшиеся попытки:" << (MAX_WRONG - wrong);
* * * * cout << "\n\nВы использовали следующие буквы:\n " << used << endl;
* * * * cout << "\nПока что, слово:\n" << soFar << endl;
C++
1
2
3
cout << "\n\nОставшиеся попытки:" << (MAX_WRONG - wrong)
     << "\n\nВы использовали следующие буквы:\n " << used << endl
     << "\nПока что, слово:\n" << soFar << endl;
Цитата Сообщение от DRONCSKA Посмотреть сообщение
cin >> guess;
Буквы считываются в буфер консоли а потом, из него считывается программой. Если не делать
C++
1
cin.ignore()
сразу перез запросом ввода тогда весь "мусор" будет попадать, если ты не 1 а 2 буквы введешь, а потом запросишь ввод еще раз то вместо 3й буквы получишь 2ю.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
09.02.2018, 19:16
Цитата Сообщение от DRONCSKA Посмотреть сообщение
Не работает перевод в верхний регистр с русскими буквами в VS
Добавь:
C++
1
setlocale(0, "");
И приводи аргументы функций cctype к unsigned char.
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
10.02.2018, 01:15
DRONCSKA, я на юникоде сделал

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <cctype>
 
using namespace std;
 
int main()
{
    //Подготовка
    const int MAX_WRONG = 8;
    const vector<string> THE_WORD = {u8"о", u8"г", u8"о", u8"н", u8"ь"};
    int wrong = 0;
    vector<string> soFar;
    for (int i = 0; i < THE_WORD.size(); ++i)
        soFar.push_back(u8"-");
    vector<string> used;
    cout << u8"\nДобро пожаловать в 'Виселицу'. Удачи.\n";
    //Основной цикл
    while ((wrong < MAX_WRONG) && (soFar != THE_WORD))
    {
        string guess;
        cout << "\033[2J\033[1;1H"
             << u8"Оставшиеся попытки:" << (MAX_WRONG - wrong)
             << u8"\nВы использовали следующие буквы:\n "
             << std::accumulate(used.begin(), used.end(), string(u8""))
             << u8"\nПока что, слово:\n"
             << std::accumulate(soFar.begin(), soFar.end(), string(u8"")) << " " << soFar.size()
             << u8"\nВведите букву: ";
        cin >> guess;
        while (std::count(used.begin(), used.end(), guess))
        {
            cout << u8"\nВы уже вводили " << guess << endl;
            cout << u8"Введите букву: ";
            cin >> guess;
        }
        used.push_back(guess);
        if (std::count(THE_WORD.begin(), THE_WORD.end(), guess))
        {
            cout << u8"Это верно! " << guess << u8" есть в слове.\n";
            for (int i = 0; i < THE_WORD.size(); i += 1)
            {
                if (THE_WORD[i] == guess)
                {
                    soFar[i] = THE_WORD[i];
                    // soFar[i + 1] = THE_WORD[i + 1];
                }
            }
        }
        else
        {
            cout << u8"Прости,буквы " << guess << u8" нет в слове.\n";
            ++wrong;
        }
    }
    //Конец игры
    if (wrong == MAX_WRONG)
    {
        cout << u8"\nПодвесили лошару!";
    }
    else
    {
        cout << u8"\nВай вай вай, какой красавчик, могешь, отгадал!!!";
    }
    cout << u8"\nЭто слово " << std::accumulate(THE_WORD.begin(), THE_WORD.end(), string(u8"")) << endl;
}
Не знаю поддерживает ли юникод консоль винды.

Добавлено через 2 минуты
Косо криво, зато пашет на линухе

Добавлено через 25 секунд
Юникод - больная тема на плюсах оказывается...
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
10.02.2018, 04:59
Цитата Сообщение от DRONCSKA Посмотреть сообщение
Не работает перевод в верхний регистр с русскими буквами в VS
Она в таком виде и не должна работать.
Учтите, что все стандартные формы таких функций, равно как и функций для работы с символьными строками в стиле C работают только тогда, когда применяемые в них символы имеют ASCII коды до 127, то есть эти функции рассчитаны только для потребления американцами.

Чтобы они заработали с русским языком, надо использовать их другую версию, определяемую в заголовочном файле locale.
Ну вообщем делается это примерно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include <iostream>
#include <locale>
 
using std::cout;
using namespace std;
 
auto main(int argc, char * argv[]) -> int
{
    system("chcp 1251");
    system("cls");
    
    locale loc("Russian_Russia");
    char result1 = toupper('ф', loc);
    cout << result1 << endl;
 
    system("pause");
    return EXIT_SUCCESS;
}
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
10.02.2018, 06:08
Просто Саша,
Code
1
2
3
$ g++ -Wall -fexceptions -O3 -std=c++11 -o run run.cpp 
warning: multi-character character constant [-Wmultichar]
     char result = toupper('ф', loc);
Добавлено через 9 минут
DRONCSKA, Просто Саша, до сих пор не знаю как большие в маленькие перевести, мб свою написать в старом стиле, мол если c >= 'a' && c <= 'я' тогда добабляем разницу 'а' - 'А'. Но не к char а к char16_t.

Вот что вышло в итоге

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
#include <iostream>
#include <codecvt>
#include <locale>
 
using namespace std;
 
char16_t up(char16_t c)
{
    if (c >= u'а' && c <= u'я')
        c += u'А' - u'а';
    return c;
}
 
int main()
{
    wstring_convert<codecvt_utf8_utf16<char16_t>, char16_t> conv;
 
    char16_t c = up(u'ф');
    u16string us;
    us += c;
 
    string add;
    cin >> add;
    u16string uadd = conv.from_bytes(add);
    us += uadd.front();
 
    string s = conv.to_bytes(us);
    cout << s << " " << s << endl;
}
Тут и ввод одного символа и преобразование в верхний регистр есть.

Добавлено через 1 минуту
Немного парит что ввод идет byte string даже если это один символ, так как в Unicode кирилица вся в 2 байта занимает.

Добавлено через 2 минуты
Ну а полный писец наступает тогда когда надо in place поменять символ в строке юникода а он больше 32 бит... В стандарте есть char32_t а выше?
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
10.02.2018, 07:00
Цитата Сообщение от outoftime Посмотреть сообщение
если c >= 'a' && c <= 'я'
Так нельзя делать.
Нет такой кодировки, в которой все русские символы идут подряд.
Вы получите чепуху, как минимум с буквой Ё.

Да и ещё, не используйте типы char16_t и char32_t. Некоторые функции ввода-вывода не перегружаются для этих типов.
А вот с wchar_t они работать умеют. Сам же этот wchar_t одного из char16_t и char32_t в зависимости от байтности кодировки.

Добавлено через 5 минут
Да и вообще, зачем Вы используете эти типы, если любая восьмибитная кодировка, в том числе 1251 вполне охватывается типом char.

Добавлено через 58 секунд
Цитата Сообщение от outoftime Посмотреть сообщение
а он больше 32 бит
Такого быть не может. Максимальная байтность кодировок - 4 байта.
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
10.02.2018, 07:20
Цитата Сообщение от Просто Саша Посмотреть сообщение
Да и вообще, зачем Вы используете эти типы, если любая восьмибитная кодировка, в том числе 1251 вполне охватывается типом char.
Эм.. начать холи вар?

Цитата Сообщение от Просто Саша Посмотреть сообщение
Так нельзя делать.
Нет такой кодировки, в которой все русские символы идут подряд.
Вы получите чепуху, как минимум с буквой Ё.
Только с ней и будут проблемы, смотрим http://www.unicode.org/charts/PDF/U0400.pdf Правда нужно сделать оговорку, что украинсткий и т.д. имеют больше исключений чем русский язык.

Добавлено через 2 минуты
Просто Саша, https://stackoverflow.com/questions/9533258/what-is-the-maximum-number-of-bytes-for-a-utf-8-encoded-character#answer-35027139
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
10.02.2018, 08:08
Цитата Сообщение от outoftime Посмотреть сообщение
Эм.. начать холи вар?
Холивара не надо.
И вот такой код, тоже будет работать правильно:

C++
1
2
3
4
char16_t myChar = 'ё';
locale loc("Russian_Russia");
char result1 = toupper(myChar, loc);
cout << result1 << endl;
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
10.02.2018, 14:07
Просто Саша, что за люди
Code
1
2
3
4
5
$ clang++ -Wall -fexceptions -O3 -std=c++11 -o run run.cpp 
run.cpp:7:23: error: character too large for enclosing character literal type
    char16_t myChar = 'ё';
                      ^
1 error generated.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
using namespace std;
 
int main()
{
    char16_t myChar = 'ё';
    locale loc("Russian_Russia");
    char result1 = toupper(myChar, loc);
    cout << result1 << endl;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.02.2018, 14:07
Помогаю со студенческими работами здесь

Перевод строки в верхний регистр
Все гласные символы слов, начинающихся на букву F, перевести в верхний регистр

Перевод строки в верхний регистр
Подскажите,как закончить ф-цию.... void UpperRistr(QString str) { for(int i=str.size();i&lt;=0;++i) { ...

Перевод строки в верхний регистр
Назовем строку сложной, если она состоит только из маленьких и больших символов латинского алфавита. Тогда простой строкой будет являться...

Перевод предложения в верхний регистр
Нужно написать программу, которая принимает строку и переводит её в верхний регистр. Помогите пожалуйста написать Это не работает: ...

Перевод символов в верхний регистр
Изменить программу так, чтобы, если набирать клавиши на нижнем регистре, то на дисплее отображались бы значения верхнего регистра. ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 09.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru