Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 29.12.2017
Сообщений: 7
1

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

09.02.2019, 02:55. Просмотров 1869. Ответов 2
Метки нет (Все метки)


Доброго времени суток.
Пыталась разобраться самостоятельно, но, к сожалению, недостаточно опыта.
Пыжусь в Visual Studio 2017
Имеется:
-скрипт для ввода данных с клавиатуры (Курс, Фамилия И.О. и Пол).
Косячит на:
-выводе Фамилии И.О. в консоли
Кликните здесь для просмотра всего текста
Вывод кракозябр вместо английских букв


Перепробовала все варианты для ввода строк с пробелами, но вылезает все то же, просто с разными кракозябрами.
Состоит скрипт из двух частей (cpp и h), где конкретно ошибка или надо подправить уже в упор не вижу.
До момента переноса в void Person::Input() работало все прекрасно, но затребовали сделать отдельно, где работать уже перестало
cpp:
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
#include "pch.h"
#include <stdlib.h>
#include <string>
#include <iostream>
#include "Main.h"
using namespace std;
 
Person::Person(int Number, const char *Name, int Sex) //Конструктор
{
    Person::Number = Number; //Соответствие номера курса номеру курса
    //strcpy(Person::Name,Name); //Функция для копирования строки имени человека (ФИО).
    Person::Name = Name; //Соответствие имени имени
    Person::Sex = Sex; //Соответствие пола полу
}
Person::Person()// Пустой конструктор по умолчанию
{
}
void Person::Print(void) //Функция вывода данных на экран
{
    cout << "Course: " << Number << " Name: " << Name << " Sex: " << Sex << endl; //Команда вывода заранее созданных данных
}
int main() //Главная функция программы
{
    Person worker(1, "Volkov A.M.", 0); //Значение данных объекта
    worker.Print(); //Вывод данных на экран
    Person *per; //Создание динамического объекта
    per = new Person(2, "Medvedeva L.D.", 1); //Значение данных динамического объекта
    per->Print(); //Вывод на экран данных динамического объекта
    delete per; //Удаление динамического объекта
    per = new Person(); //Значение данных динамического объекта
    per->Input(); //Ввод данных динамического объекта с клавиатуры
    per->Print(); //Вывод на экран данных динамического объекта
    delete per; //Удаление динамического объекта
    system("pause"); //Команда задержки экрана
}
void Person::Input() //Функция ввода данных в объект
{
    cout << "Enter Course:"; //Вывод  запроса ввода курса студента
    cin >> Number; //Ввод данных (курс) с клавиатуры
    cin.ignore(); // Пропуск символа из потока чтения
    cout << "Enter Name: "; //Вывод запроса ввода ФИО студента
    string tmp; //Временная строка для ввода ФИО студента
    getline(cin, tmp); //Ввод данных (Фамилия, И.О.) с клавиатуры
    Name = tmp.c_str();
    cout << "Enter Sex: "; //Вывод запроса ввода пола студента
    cin >> Sex; //Ввод данных (пол) с клавиатуры
}
и h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once
#include <iostream>
#include <string>
using namespace std;
 
class Person
{
private:
    int Number; //Курс, целый тип
    const char *Name; //ФИО, символьный массив
    int Sex; //Пол, логический тип: 0=муж, 1=жен
public:
    Person(int, const char*, int); //Конструктор
    Person(); //Конструктор по умолчанию, без аргументов
    void Print(); //Вывод данных на экран
    void Input(); //Ввод данных с клавиатуры
};
Комментарии практически везде из-за требования в методичке. заголовок pch.h висит из-за того, что он был изначально.
Заранее благодарю за оказанную помощь.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2019, 02:55
Ответы с готовыми решениями:

Вывод в документ: китайские иероглифа вместо русских или английских букв
В коде какато фигня. Он написан и по идее работает, но вот с языком вывода проблема. Когда...

Вывод английских букв
Составить программу вывода последовательности символов (в английском алфавите 26 букв). Обязательно...

Как в консоли включить русский язык вместо кракозябр?
Решил попробовать себя и на с++ Первый же вопрос: как в консоли включить русский язык вместо...

Вывод непонятных символов вместо русских букв
Здравствуйте, возникла такая проблема, что при выводе строки в методе Show() тот текст, который...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
2
13 / 7 / 6
Регистрация: 02.02.2019
Сообщений: 36
09.02.2019, 07:37 2
Лучший ответ Сообщение было отмечено Adelahan как решение

Решение

Проблема тут, наиболее вероятно, кроется в константности переменной Name в классе Person. Дело в том, что константные переменные нельзя изменять, но можно инициализировать:
C++
1
2
Name("abc"); // можно, так как это изначальное определение (инициализация) значения Name
Name = "abc"; // так уже нельзя, потому что мы уже определили значение Name (инициализировали) в предыдущей строке, а изменять его нельзя (Name - const)
Соответственно, когда вы присваивали значение Name в конструкторе, происходила инициализация, то же самое было в функции main. Но когда вы захотели присвоить значение Name в методе Person::Input, то инициализация Name уже была (в конструкторе класса Person), а значит вы пытаетесь изменить значение Name, что не приводит к успеху. Возможные решения такие:
1) Изменить тип Name на std::string и не париться (std::string намного удобнее и безопаснее), правда и придется переписать несколько строчек кода. Я бы выбрал этот вариант.
2) Если по заданию вам нужно вводить Name в любом месте программы и несколько раз, то Name по определению не может быть const. Соответственно, нужно изменить тип Name на char*. Но тут есть много подводных камней, с которыми придется разбираться, так как c-строки в c/c++ это очень сложная тема.
Надеюсь, помог
1
0 / 0 / 0
Регистрация: 29.12.2017
Сообщений: 7
09.02.2019, 12:28  [ТС] 3
Огроменнейшее спасибо за подсказку. Действительно, сменив на string - кракозябры исчезли, вернулся адекватный текст)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2019, 12:28

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Вывод текста на консоль, закарючки вместо букв
Я создал консольное win32 приложение в vs2010. Попробовал cout'ом вывести текст русскими буквами -...

Непонятные символы вместо английских букв
Мне очень не удобно пользоваться программой из-за непонятных символов вместо английских букв. Как...

Вывод кракозябр
??????????? 1 ?????? ????? ???? ????????? Типа такого, пытался задать кодировку...

Найти все группы букв, содержащие сочетание английских букв 'mn'
Рассматривается непустая строка,содержащая не более 80 символов.Каждый символ строки может быть...

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

Найти все группы букв, содержащие наименьшее количество согласных английских букв
В поиске нашёл такую же задачу, только на Delphi Помогите решить задачу: Рассматривается...


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

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

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