Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/47: Рейтинг темы: голосов - 47, средняя оценка - 4.79
1 / 1 / 1
Регистрация: 11.11.2013
Сообщений: 31
1

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

13.05.2014, 22:27. Показов 8515. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. Проблема такая: есть структура, в которой присутствует поле 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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2014, 22:27
Ответы с готовыми решениями:

При выводе массива выводятся лишние непонятные символы
Имеется массив vord из 10 символов. Ввожу несколько символов(например 4 символа) в этот массив....

Отображаются лишние символы при выводе массива символов
#include &lt;iostream.h&gt; #include &lt;string.h&gt; // для функций str*...

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

Русские символы при выводе из файла на консоль без использования BufferedReader
Неправильно отображаются русские символы при выводе их из файла на консоль, либо при копировании из...

18
Заблокирован
Автор 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;
}
Миниатюры
Русские символы при выводе массива структуры  
1
Заблокирован
Автор FAQ
13.05.2014, 23:48 3
Цитата Сообщение от crypt Посмотреть сообщение
роблема такая: есть структура, в которой присутствует поле lastname[20] типа char, при выводе которого в консоле вместо кириллицы появляются какие-то непонятные символы
- теперь по косточкам твою проблему - выводится невесть что потому как вызов метода
Цитата Сообщение от crypt Посмотреть сообщение
setlocale(LC_CTYPE,"Rus");
не руссифицирует ввод (с этим туго даже у самых последних версий VS).
Миниатюры
Русские символы при выводе массива структуры  
2
Заблокирован
Автор 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;
}
Миниатюры
Русские символы при выводе массива структуры  
2
1 / 1 / 1
Регистрация: 11.11.2013
Сообщений: 31
14.05.2014, 00:32  [ТС] 5
Понял. Спасибо большое.
З.Ы. Студию юзаю 2012 ультимейт.
0
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 что-то нужно изменить?
Миниатюры
Русские символы при выводе массива структуры  
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
18.05.2014, 15:20 7
Цитата Сообщение от GBool Посмотреть сообщение
cout << "\n1. Создание списка сотрудников:\n" << endl;
C++
1
wcout <<L"\n1. Создание списка сотрудников:\n" << endl;
0
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|
Как это решить оставив функции вне мейна?
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
18.05.2014, 16:23 9
Покажи этот фрагмент "вне функции".
0
2 / 2 / 0
Регистрация: 13.05.2014
Сообщений: 8
18.05.2014, 16:30 10
Цитата Сообщение от nmcf Посмотреть сообщение
Покажи этот фрагмент "вне функции".
Имею ввиду, что объявление функций происходит до main, в main же только вызовы. Так вот wcout из этих функций выдается как на приведенном скрине.
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
18.05.2014, 16:43 11
Ты что-то неправильно пишешь, L - это просто признак wide-строки, не важно где расположен.
Поэтому и говорю, покажи.
0
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|
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
18.05.2014, 17:01 13
Надо убрать пробел между L и строкой
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
18.05.2014, 17:06 14
Я же говорю, что неправильно написал.
0
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;
}


Не хочу показаться наглецом, но моет взглянете так же на последнюю функцию. Запутался я в циклах и условиях. А тему создать не могу отдельную.
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
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;
}
0
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> тоже добавлен
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
18.05.2014, 18:48 18
В свойствах проекта установите Уникод!
Проект->Свойства->Свойства конфигурации ->Общие ->
Набор знаков -> Использовать уникод.
0
2 / 2 / 0
Регистрация: 13.05.2014
Сообщений: 8
18.05.2014, 21:48 19
Цитата Сообщение от zss Посмотреть сообщение
Проект->Свойства->Свойства конфигурации ->Общие ->
Набор знаков -> Использовать уникод.
Это настройки для Visual Studio? Скомпилировал код в этой среде, но ошибок получил еще больше, чем в Code::Blocks'e. Уже не рад, что заглянул сегодня в эту тему
Хочется доделать этот проект в привычной среде, может подскажете где включить использование unicode в кодблоксе?

Добавлено через 2 часа 11 минут
upd. zss вам отдельное спасибо за функцию!
0
18.05.2014, 21:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.05.2014, 21:48
Помогаю со студенческими работами здесь

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

Массив: Почему у меня при выводе массива отражаются только первые символы каждой строки, а не вся она целиком?
почему у меня при выводе массива отражаются толко первые символы каждой строки а не вся она...

Русские буквы при выводе на консоль
Стоит vista и active perl 5.10.0 use locale; print &quot;абвгд&quot;; не выводит на консоль того что...

Не так выглядят русские буквы при выводе в файл.
Всем программистам привет! Написал программу алфавитно-частотный указатель, но почему-то данные в...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru