Другие языки программирования и технологии

Где ошибка в коде С++ ?

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

#include<iostream>

#include<conio.h>

#include<cstring>

using std::cout;

using std::endl;

using std::cin;

int main()

{

setlocale(LC_ALL, "Russian");

char str[20] ;

int age;

int phone;

cout << "\n \t\tВведите ваши персональные данные";

cout << "\n \n Введите свое имя" << endl;

cin.getline(str, 20);



cout << "\n Введите свой телефон" << endl;

cin >> phone;

cout << "\n Введите свой возраст" << endl;

cin >> age ;

system("cls");

cout << "\nИмя - " << str << endl;

cout << "Телефон - " << phone << endl;

cout << "Возраст - " << age << endl;
#include <iostream>
#include <string>
using namespace std;
enum point { IN_PERSON, IN_NAME, IN_PHONE, INP_AGE, OUT_NAME, OUT_PHONE, OUT_AGE };
void ui(enum point);
int main() {
ui(IN_PERSON);
ui(IN_NAME); string name; getline(cin, name);
ui(IN_PHONE); unsigned long phone; cin >> phone;
ui(INP_AGE); unsigned short age; cin >> age;
system("cls");
ui(OUT_NAME); cout << name << endl;
ui(OUT_PHONE); cout << phone << endl;
ui(OUT_AGE); cout << age << endl;
cin.sync();
cin.get();
}
void ui(enum point pt) {
setlocale(LC_CTYPE, "Russian_Russia.1251");
switch (pt) {
case IN_PERSON: cout << "\n\t\tВведите ваши персональные данные\n"; break;
case IN_NAME: cout << "Введите свое имя: "; break;
case IN_PHONE: cout << "Введите номер телефона: "; break;
case INP_AGE: cout << "Введите возраст: "; break;
case OUT_NAME: cout << "Имя - "; break;
case OUT_PHONE: cout << "Телефон - "; break;
case OUT_AGE: cout << "Возраст - "; break;
default: exit(1); break;
}
setlocale(LC_CTYPE, "English_United States.866");
}

#include <iostream>
#include <string>
using namespace std;
enum point { IN_PERSON, IN_NAME, IN_PHONE, INP_AGE, OUT_NAME, OUT_PHONE, OUT_AGE};
void ui(enum point);
int main() {
ui(IN_PERSON);
ui(IN_NAME); string name; getline(cin, name);
ui(IN_PHONE); unsigned long phone; cin >> phone;
ui(INP_AGE); unsigned short age; cin >> age;
system("cls");
ui(OUT_NAME); cout << name << endl;
ui(OUT_PHONE); cout << phone << endl;
ui(OUT_AGE); cout << age << endl;
cin.sync();
cin.get();
}
void ui(enum point pt) {
locale::global(locale(".1251"));
switch (pt) {
case IN_PERSON: cout << "\n\t\tВведите ваши персональные данные\n"; break;
case IN_NAME: cout << "Введите свое имя: "; break;
case IN_PHONE: cout << "Введите номер телефона: "; break;
case INP_AGE: cout << "Введите возраст: "; break;
case OUT_NAME: cout << "Имя - "; break;
case OUT_PHONE: cout << "Телефон - "; break;
case OUT_AGE: cout << "Возраст - "; break;
default: exit(1); break;
}
locale::global(locale(".866"));
}

#include <iostream>
#include <string>
using namespace std;
int main() {
system("chcp 1251 > nul");
cout << "\n\t\tВведите ваши персональные данные\n";
cout << "Введите свое имя: ";
string name;
getline(cin, name);
cout << "Введите номер телефона: ";
unsigned long phone;
cin >> phone;
cout << "Введите возраст: ";
unsigned short age;
cin >> age;
system("cls");
cout << "Имя - " << name << endl << "Телефон - " << phone << endl << "Возраст - " << age << endl;
cin.sync();
cin.get();
}

#include <iostream>
#include <string>
using namespace std;
void rus();
int main() {
rus();
wcout << L"\n\t\tВведите ваши персональные данные\n";
wcout << L"Введите свое имя: ";
wstring name;
getline(wcin, name);
wcout << L"Введите номер телефона: ";
unsigned long phone;
cin >> phone;
wcout << L"Введите возраст: ";
unsigned short age;
cin >> age;
system("cls");
wcout << L"Имя - " << name << endl << L"Телефон - ";
cout << phone << endl;
wcout << L"Возраст - ";
cout << age << endl;
wcin.sync();
cin.get();
}
void rus() {
wcout.imbue(locale(".866"));
wcin.imbue(locale(".866"));
}
АЛ
Антон Лютов
59 461
Лучший ответ
Код верен, а проблема в консоли. Консольное окно создается не только вашей программой, но еще и cmd.exe. которая входит в состав винды. Вот в ней и дело.
Помочь вам, не зная, в какой среде вы пишете, нельзя.

Если в Dev C++, выбросьте эту глючную дрянь и поставьте Visual Studio, лучше 2008. Там глюки тоже есть, но работать можно. в том числе с графическим интерфейсом, а не с унылой консолью.
локаль вам не поможет, тут надо конвертировать строки
ИЧ
Игорь Чурзин
53 908
Кодировки - слабое место консоли Windows (там ввод на cp866, а вывод из твоего кода на cp1251). Не хочешь секса - вводи латиницей и не морочь себе голову.
Олег Вапилов
Олег Вапилов
50 287
... ну братишка - тут полная ж.. . -дупло, кароче.
Перед тем как вывести символьную переменную надо поставить локаль на С, а потом поменять на нормальную
На сколько помню отвечали уже тут, исправить ошибку можно с помощью - WindowsFix
Локаль на "С" может-поможет ;)

А вообще, есть куча других работающих функций для перекодировки :)
VJ
Vasilii Jagodin
142
Самое простое решение:
AB
Absent Boy :)
106