Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
crypt
1 / 1 / 1
Регистрация: 11.11.2013
Сообщений: 31
#1

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

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

Добрый вечер. Проблема такая: есть структура, в которой присутствует поле 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2014, 22:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Русские символы при выводе массива структуры (C++):

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

При выводе массива выводятся лишние непонятные символы - C++
Имеется массив vord из 10 символов. Ввожу несколько символов(например 4 символа) в этот массив. Определяю их количество - count. Создаю...

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

Непонятные символы при выводе - C++
Я уже такую фигню много раз наблюдал типа если не поставить '\0' или убрать при выводе какие то непонятные символы идут от пример. ...

Лишние символы при выводе строк - C++
При создании игрового поля для тетриса (вывод строк, в соответствии с заданным алгоритмом) возникает странная ошибка. Вместо, собственно,...

Некорректно отображаются русские символы при вводе в консоль - C++
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; int main() { setlocale(0, &quot;Russian&quot;);...

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
Миниатюры
Русские символы при выводе массива структуры  
crypt
1 / 1 / 1
Регистрация: 11.11.2013
Сообщений: 31
14.05.2014, 00:32  [ТС] #5
Понял. Спасибо большое.
З.Ы. Студию юзаю 2012 ультимейт.
0
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 что-то нужно изменить?
0
Миниатюры
Русские символы при выводе массива структуры  
zss
Модератор
Эксперт С++
6578 / 6140 / 2021
Регистрация: 18.12.2011
Сообщений: 15,994
Завершенные тесты: 1
18.05.2014, 15:20 #7
Цитата Сообщение от GBool Посмотреть сообщение
cout << "\n1. Создание списка сотрудников:\n" << endl;
C++
1
wcout <<L"\n1. Создание списка сотрудников:\n" << endl;
0
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|
Как это решить оставив функции вне мейна?
0
nmcf
5685 / 4996 / 1703
Регистрация: 14.04.2014
Сообщений: 20,379
18.05.2014, 16:23 #9
Покажи этот фрагмент "вне функции".
0
GBool
2 / 2 / 0
Регистрация: 13.05.2014
Сообщений: 8
18.05.2014, 16:30 #10
Цитата Сообщение от nmcf Посмотреть сообщение
Покажи этот фрагмент "вне функции".
Имею ввиду, что объявление функций происходит до main, в main же только вызовы. Так вот wcout из этих функций выдается как на приведенном скрине.
0
nmcf
5685 / 4996 / 1703
Регистрация: 14.04.2014
Сообщений: 20,379
18.05.2014, 16:43 #11
Ты что-то неправильно пишешь, L - это просто признак wide-строки, не важно где расположен.
Поэтому и говорю, покажи.
0
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|
0
zss
Модератор
Эксперт С++
6578 / 6140 / 2021
Регистрация: 18.12.2011
Сообщений: 15,994
Завершенные тесты: 1
18.05.2014, 17:01 #13
Надо убрать пробел между L и строкой
0
nmcf
5685 / 4996 / 1703
Регистрация: 14.04.2014
Сообщений: 20,379
18.05.2014, 17:06 #14
Я же говорю, что неправильно написал.
0
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;
}


Не хочу показаться наглецом, но моет взглянете так же на последнюю функцию. Запутался я в циклах и условиях. А тему создать не могу отдельную.
0
18.05.2014, 17:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2014, 17:22
Привет! Вот еще темы с ответами:

Добавляются лишние символы при выводе данных в поток - C++
Есть char buff; куда пишутся данные с сети. вывожу на печать: cout &lt;&lt;&quot;IMEI- &quot; &lt;&lt; &quot;--&quot; &lt;&lt; buff&lt;&lt;buff&lt;&lt;buff ...

Непонятные символы при выводе русских символов в консоли - C++
Доброго времени суток, у меня возникла проблема. Когда я ввожу текст с клавиатуры, при выводе его на экран выводит непонятные символы....

Как убрать лишние символы при выводе в консоль списка файлов? - C++
Поясните, пожалуйста. Собираю кроссплатформенные методы, для работы с файлами. Взял для разбора такой метод. Всё работает, только вот...

Широкие символы wchar_t wstring не хотят принимать русские символы - C++
Собственно вопрос в шапке, вот примеры: std::wstring str = L&quot;блин комом&quot;; и такое: wchar_t stroka = L&quot;abcdefghijklmnopqrstuvwxyz...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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