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

Русские символы при выводе массива структуры - C++

Восстановить пароль Регистрация
 
crypt
 Аватар для crypt
1 / 1 / 1
Регистрация: 11.11.2013
Сообщений: 30
13.05.2014, 22:27     Русские символы при выводе массива структуры #1
Добрый вечер. Проблема такая: есть структура, в которой присутствует поле lastname[20] типа char, при выводе которого в консоле вместо кириллицы появляются какие-то непонятные символы, хотя оператор setlocale(LC_CTYPE,"Rus") в начале функции я указал. Вот, собственно, код:
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
void main()
{
    setlocale(LC_CTYPE,"Rus");
    int n,i,j,prizn=0;
    struct Students
    {
        char lastname[20];
        int date,year,marks[4];
    };
    cout << "Введите количество студентов: ";
    cin >> n;
    Students *Info=new Students[n];
    for (i=0;i<n;i++)
    {
        cout << "Введите фамилию " << i+1 << "-го студента: ";
        cin >> Info[i].lastname;
        cout << "Введите год рождения " << i+1 << "-го студента: ";
        cin >> Info[i].date;
        cout << "Введите год поступления " << i+1 << "-го студента: ";
        cin >> Info[i].year;
        for (j=0;j<4;j++)
        {
            cout << "Введите " << j+1 << "-ю оценку " << i+1 << "-го студента: ";
            cin >> Info[i].marks[j];
        }
        system("cls");
    }
    for (i=0;i<n;i++)
    {
        cout << Info[i].lastname << ": год рождения - " << Info[i].date << "; год поступления - " << Info[i].year << "; оценки: ";
        for (j=0;j<4;j++)
            cout << Info[i].marks[j] << ";";
        cout << endl;
    }
    delete [] Info;
    _getch();
    return;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
13.05.2014, 23:37     Русские символы при выводе массива структуры #2
И студия ещё наверное 6-ая...
Вот так пойдёт для любой версии VS
C++
1
2
3
4
5
6
7
8
9
10
#include <clocale>
#include <iostream>
using namespace std;
 
int main(){
    setlocale(LC_CTYPE, ".866");
    wcout<<L"Ïðèâåò ìèð Г*Г* êèðèëëèöå"<<endl;
    cin.get();
    return 0;
}
Миниатюры
Русские символы при выводе массива структуры  
-=ЮрА=-
Заблокирован
Автор FAQ
13.05.2014, 23:48     Русские символы при выводе массива структуры #3
Цитата Сообщение от crypt Посмотреть сообщение
роблема такая: есть структура, в которой присутствует поле lastname[20] типа char, при выводе которого в консоле вместо кириллицы появляются какие-то непонятные символы
- теперь по косточкам твою проблему - выводится невесть что потому как вызов метода
Цитата Сообщение от crypt Посмотреть сообщение
setlocale(LC_CTYPE,"Rus");
не руссифицирует ввод (с этим туго даже у самых последних версий VS).
Миниатюры
Русские символы при выводе массива структуры  
-=ЮрА=-
Заблокирован
Автор FAQ
13.05.2014, 23:50     Русские символы при выводе массива структуры #4
Чтобы не писать гору кода по руссификации рекомендую вводить и работать с широкими символами, будешь приятно удивлён
C++
1
2
3
4
5
6
7
8
9
10
int main(){
setlocale(LC_CTYPE, ".866");
    wcout<<L"Ïðèâåò ìèð Г*Г* êèðèëëèöå"<<endl;
    wchar_t name[32] = {0};
    wcout<<L"Ââåäèòå èìÿ : ";
    wcin>>name;
    wcout<<name<<endl;
    cin.get();
    return 0;
}
Миниатюры
Русские символы при выводе массива структуры  
crypt
 Аватар для crypt
1 / 1 / 1
Регистрация: 11.11.2013
Сообщений: 30
14.05.2014, 00:32  [ТС]     Русские символы при выводе массива структуры #5
Понял. Спасибо большое.
З.Ы. Студию юзаю 2012 ультимейт.
GBool
2 / 2 / 0
Регистрация: 13.05.2014
Сообщений: 8
18.05.2014, 15:12     Русские символы при выводе массива структуры #6
Попробовал применить такое решение. Что-то не получилось.
C++
1
2
3
4
5
6
7
8
#include <clocale>
....
setlocale(LC_CTYPE, ".866");
//setlocale(LC_ALL, "Russian");
//SetConsoleCP(1251);
//SetConsoleOutputCP(1251);
.....
 cout << "\n1. Создание списка сотрудников:\n" << endl;
Подскажите, в чем может быть проблема?
Возможно, в настройках CodeBlocks что-то нужно изменить?
Миниатюры
Русские символы при выводе массива структуры  
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
18.05.2014, 15:20     Русские символы при выводе массива структуры #7
Цитата Сообщение от GBool Посмотреть сообщение
cout << "\n1. Создание списка сотрудников:\n" << endl;
C++
1
wcout <<L"\n1. Создание списка сотрудников:\n" << endl;
GBool
2 / 2 / 0
Регистрация: 13.05.2014
Сообщений: 8
18.05.2014, 16:18     Русские символы при выводе массива структуры #8
Цитата Сообщение от zss Посмотреть сообщение
wcout
Так работает. Благодарю!

Добавлено через 38 минут
Цитата Сообщение от zss Посмотреть сообщение
wcout <<L
Обнаружил, что в функциях объявленных до main выдает такую ошибку:
C++
1
error: 'L' was not declared in this scope|
Как это решить оставив функции вне мейна?
nmcf
4315 / 3736 / 1259
Регистрация: 14.04.2014
Сообщений: 14,642
18.05.2014, 16:23     Русские символы при выводе массива структуры #9
Покажи этот фрагмент "вне функции".
GBool
2 / 2 / 0
Регистрация: 13.05.2014
Сообщений: 8
18.05.2014, 16:30     Русские символы при выводе массива структуры #10
Цитата Сообщение от nmcf Посмотреть сообщение
Покажи этот фрагмент "вне функции".
Имею ввиду, что объявление функций происходит до main, в main же только вызовы. Так вот wcout из этих функций выдается как на приведенном скрине.
nmcf
4315 / 3736 / 1259
Регистрация: 14.04.2014
Сообщений: 14,642
18.05.2014, 16:43     Русские символы при выводе массива структуры #11
Ты что-то неправильно пишешь, L - это просто признак wide-строки, не важно где расположен.
Поэтому и говорю, покажи.
GBool
2 / 2 / 0
Регистрация: 13.05.2014
Сообщений: 8
18.05.2014, 16:56     Русские символы при выводе массива структуры #12
Цитата Сообщение от nmcf Посмотреть сообщение
покажи.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void InputMembers(workers *lrh, int len)
{
    for(int i = 0; i < len; ++i)
    {
        wcout <<L "Введите данные для "<<i+1<<"-го сотрудника\n";
        wcout << setw(9) << setiosflags(ios::left) << "Имя:";
.......
int main()
{
    setlocale(LC_CTYPE, ".866");
    //setlocale(LC_ALL, "Russian");
    //SetConsoleCP(1251);
    //SetConsoleOutputCP(1251);
 
    workers Sheet[col];         // массив работников
    wcout <<L "\n1. Создание списка сотрудников:\n" << endl;
    InputMembers(Sheet, col);
    cout << endl;
C++
1
|122|error: 'L' was not declared in this scope|
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
18.05.2014, 17:01     Русские символы при выводе массива структуры #13
Надо убрать пробел между L и строкой
nmcf
4315 / 3736 / 1259
Регистрация: 14.04.2014
Сообщений: 14,642
18.05.2014, 17:06     Русские символы при выводе массива структуры #14
Я же говорю, что неправильно написал.
GBool
2 / 2 / 0
Регистрация: 13.05.2014
Сообщений: 8
18.05.2014, 17:22     Русские символы при выводе массива структуры #15
Цитата Сообщение от zss Посмотреть сообщение
Надо убрать пробел между L и строкой
Убрал, но ничего не изменилось..
Вот весь листинг.
Кликните здесь для просмотра всего текста
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// lab.cpp
 
#include <iostream>
#include <cstdlib>          // для функции system
#include <iomanip>          // для функций отступов setw
#include <clocale>          // для функций настройки локали
#include <windows.h>
//#include <stdio.h>        // _flushall
 
 
using namespace std;
///////////////////////////////////////////////////////////
struct workers
{
    char name [15];         // имя
    char lastname [15];     // фамилия
    int age;                // возраст
    int growth;             // рост
};
///////////////////////////////////////////////////////////
void InputMembers(workers *lrh, int len);
void ShowMembers(workers *lrh, int len);
void SortByGrowth(workers *lrh, int len);
void NameOfHigh(workers *lrh, int len);
void SameGrowth (workers *lrh, int len);
///////////////////////////////////////////////////////////
void InputMembers(workers *lrh, int len)
{
    for(int i = 0; i < len; ++i)
    {
        wcout <<L"Введите данные для "<<i+1<<"-го сотрудника\n";
        wcout << setw(9) << setiosflags(ios::left) << "Имя:";
        //_flushall(); cin.getline(lrh[i].name, 15);
        cin >> lrh[i].name;
        wcout << setw(9) << "Фамилия:"; cin >> lrh[i].lastname;
        wcout << setw(9) << "Возраст:"; cin >> lrh[i].age;
        wcout << setw(9) << "Рост:"; cin >> lrh[i].growth;
        cout << endl;
    }
}
void ShowMembers(workers *lrh, int len)
{
    cout << setw(3) << setiosflags(ios::left) << "№" << setw(12)
    << "Фамилия" << setw(12) << "Имя" << setw(10) << "Возраст"
    << setw(5) << "Рост" << endl;
    cout << "------------------------------------------\n";
    for(int i = 0; i < len; ++i)
    {
        cout << setw(3) << i+1 << setw(12) << lrh[i].lastname
        << setw(12) << lrh[i].name << setw(10) << lrh[i].age << setw(5)
        << lrh[i].growth << endl;
    }
    cout << "------------------------------------------\n";
}
void SortByGrowth(workers *lrh, int len)
{
    bool flag = false;
    int num = 0;
    float tmp = 0;
    for(int i = 0; i < len; ++i)
    {
        if( lrh[i].age >= 18 && lrh[i].age <=20)
        {
            flag = true;
            num++;
            tmp += lrh[i].growth;
        }
    }
    if(num != 0)
    cout << "\nСредний рост сотрудников в возрасте от 18 до 20 лет: "
    << (tmp / num) << " см." << endl;
    else
        cout << "\nВ списке нет сотрудниеов в возрасте от 18 до 20 лет."
        << endl;
}
void NameOfHigh(workers *lrh, int len)
{
    int tmp = 0;
    workers worker;         // объявление структурной переменной
    for(int i = 0; i < len; ++i)
    {
        if(lrh[i].growth > tmp)
        {
            worker = lrh[i];
        }
    }
    cout << worker.name << " самый высокий работник. Его рост "
    << worker.growth << " см" << endl;
}
void SameGrowth(workers *lrh, int len)
{
    workers worker;
    int tmp =0;
    for( int i=0; i < len; ++i)
    {
        for(int j=0; j < i; j++)
            if(lrh[i].growth == lrh[j].growth)
            tmp++;
        if(tmp == 0)
            for(int j=i+1; j < len; j++)
            if(lrh[i].growth == lrh[j].growth)
            tmp++;
        if(tmp == 0)
            cout << "Работников с одинаковым ростом в списке нет.\n";
        else
        {
            cout << "У следующих работников одинаковый рост:\n";
            cout << lrh[i].name << endl;
        }
    }
}
const int col = 4;          // количество работников
///////////////////////////////////////////////////////////
int main()
{
    setlocale(LC_CTYPE, ".866");
    //setlocale(LC_ALL, "Russian");
    //SetConsoleCP(1251);
    //SetConsoleOutputCP(1251);
 
    workers Sheet[col];         // массив работников
    wcout <<L"\n1. Создание списка сотрудников:\n" << endl;
    InputMembers(Sheet, col);
    cout << endl;
    wcout <<L "\n2. Список всех сотрудников:\n" << endl;
    ShowMembers(Sheet, col);
    cout << endl;
    wcout <<L "\n3. Вывод среднего роста сотрудников, которые ";
    cout << "находятся в возрасте от 18 до 20 лет:\n";
    SortByGrowth(Sheet, col);
    cout << endl;
    wcout <<L "\n4. Определение имени самого высокого сотрудника.\n" << endl;
    NameOfHigh(Sheet, col);
    cout << endl;
    wcout <<L "\n5. Определение сотрудников с одинаковым ростом.\n" << endl;
    SameGrowth(Sheet, col);
    cout << endl;
    system("pause");
    return 0;
}


Не хочу показаться наглецом, но моет взглянете так же на последнюю функцию. Запутался я в циклах и условиях. А тему создать не могу отдельную.
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
18.05.2014, 17:53     Русские символы при выводе массива структуры #16
С учетом замены объявления char на wchar_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
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <cstdlib>          // для функции system
#include <iomanip>          // для функций отступов setw
#include <clocale>          // для функций настройки локали
#include <windows.h>
 
using namespace std;
///////////////////////////////////////////////////////////
struct workers
{
    wchar_t name [15];         // имя
    wchar_t lastname [15];     // фамилия
    int age;                // возраст
    int growth;             // рост
};
///////////////////////////////////////////////////////////
void InputMembers(workers *lrh, int len);
void ShowMembers(workers *lrh, int len);
void SortByGrowth(workers *lrh, int len);
void NameOfHigh(workers *lrh, int len);
void SameGrowth (workers *lrh, int len);
///////////////////////////////////////////////////////////
void InputMembers(workers *lrh, int len)
{
    for(int i = 0; i < len; ++i)
    {
        wcout <<L"Введите данные для "<<i+1<<L"-го сотрудника\n";
        wcout << setw(9) << setiosflags(ios::left) << L"Имя:";
        //_flushall(); cin.getline(lrh[i].name, 15);
        wcin >> lrh[i].name;
        wcout << setw(9) << L"Фамилия:"; wcin >> lrh[i].lastname;
        wcout << setw(9) << L"Возраст:"; wcin >> lrh[i].age;
        wcout << setw(9) << L"Рост:"; wcin >> lrh[i].growth;
        wcout << endl;
    }
}
void ShowMembers(workers *lrh, int len)
{
    wcout << setw(3) << setiosflags(ios::left) << L"№" << setw(12)
    << L"Фамилия" << setw(12) << L"Имя" << setw(10) << L"Возраст"
    << setw(5) << L"Рост" << endl;
    cout << "------------------------------------------\n";
    for(int i = 0; i < len; ++i)
    {
        wcout << setw(3) << i+1 << setw(12) << lrh[i].lastname
        << setw(12) << lrh[i].name << setw(10) << lrh[i].age << setw(5)
        << lrh[i].growth << endl;
    }
    wcout << "------------------------------------------\n";
}
void SortByGrowth(workers *lrh, int len)
{
    bool flag = false;
    int num = 0;
    float tmp = 0;
    for(int i = 0; i < len; ++i)
    {
        if( lrh[i].age >= 18 && lrh[i].age <=20)
        {
            flag = true;
            num++;
            tmp += lrh[i].growth;
        }
    }
    if(num != 0)
    wcout << L"\nСредний рост сотрудников в возрасте от 18 до 20 лет: "
    << (tmp / num) << L" см." << endl;
    else
        wcout << L"\nВ списке нет сотрудниеов в возрасте от 18 до 20 лет."
        << endl;
}
void NameOfHigh(workers *lrh, int len)
{
    int tmp = 0;
    workers worker;         // объявление структурной переменной
    for(int i = 0; i < len; ++i)
    {
        if(lrh[i].growth > tmp)
        {
            worker = lrh[i];
        }
    }
    wcout << worker.name << L" самый высокий работник. Его рост "
    << worker.growth << L" см" << endl;
}
void SameGrowth(workers *lrh, int len)
{
    bool same=false;
    wcout << L"У следующих работников одинаковый рост:\n";
    for( int i=0; i < len; ++i)
    {
        for(int j=i+1; j < len; j++)
            if(lrh[i].growth == lrh[j].growth)
            {
               same=true;
               wcout << lrh[i].name <<L" И "<<lrh[j].name << endl;
            }
    }
    if(!same)
        wcout << L"Работников с одинаковым ростом в списке нет.\n";
}
const int col = 4;          // количество работников
///////////////////////////////////////////////////////////
int main()
{
    setlocale(LC_CTYPE, ".866");
 
    workers Sheet[col];         // массив работников
    wcout <<L"\n1. Создание списка сотрудников:\n" << endl;
    InputMembers(Sheet, col);
    wcout << endl;
    wcout <<L"\n2. Список всех сотрудников:\n" << endl;
    ShowMembers(Sheet, col);
    wcout << endl;
    wcout <<L"\n3. Вывод среднего роста сотрудников, которые ";
    wcout <<L"находятся в возрасте от 18 до 20 лет:\n";
    SortByGrowth(Sheet, col);
    wcout<<endl;
    wcout<<L"\n4. Определение имени самого высокого сотрудника.\n" << endl;
    NameOfHigh(Sheet, col);
    wcout << endl;
    wcout <<L"\n5. Определение сотрудников с одинаковым ростом.\n" << endl;
    SameGrowth(Sheet, col);
    wcout<< endl;
    system("pause");
    return 0;
}
GBool
2 / 2 / 0
Регистрация: 13.05.2014
Сообщений: 8
18.05.2014, 18:47     Русские символы при выводе массива структуры #17
Цитата Сообщение от zss Посмотреть сообщение
С учетом замены объявления char на wchar_t
При использовании этого кода, компилятор ругается на каждую строку, где встречается wcout:
C++
1
|28|error: converting to execution character set: Illegal byte sequence|
Добавлено через 8 минут
upd. заголовочный <cwchar> тоже добавлен
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
18.05.2014, 18:48     Русские символы при выводе массива структуры #18
В свойствах проекта установите Уникод!
Проект->Свойства->Свойства конфигурации ->Общие ->
Набор знаков -> Использовать уникод.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2014, 21:48     Русские символы при выводе массива структуры
Еще ссылки по теме:

C++ Добавляются лишние символы при выводе данных в поток
C++ Ошибка при выводе динамического массива
C++ Не так выглядят русские буквы при выводе в файл.

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

Или воспользуйтесь поиском по форуму:
GBool
2 / 2 / 0
Регистрация: 13.05.2014
Сообщений: 8
18.05.2014, 21:48     Русские символы при выводе массива структуры #19
Цитата Сообщение от zss Посмотреть сообщение
Проект->Свойства->Свойства конфигурации ->Общие ->
Набор знаков -> Использовать уникод.
Это настройки для Visual Studio? Скомпилировал код в этой среде, но ошибок получил еще больше, чем в Code::Blocks'e. Уже не рад, что заглянул сегодня в эту тему
Хочется доделать этот проект в привычной среде, может подскажете где включить использование unicode в кодблоксе?

Добавлено через 2 часа 11 минут
upd. zss вам отдельное спасибо за функцию!
Yandex
Объявления
18.05.2014, 21:48     Русские символы при выводе массива структуры
Ответ Создать тему
Опции темы

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