Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2021, 10:49   #1
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию Помогите заполнить массив char из класса

Добрый день.

Есть 3 файла

PhoneBook.h

Код:
#pragma once
#include <iostream>
#include <Windows.h>
#include <string.h>
#include <conio.h>

using namespace std;


class PhoneBook
{

private:

	char *FIO;
	char* MobPhone;

public:
	
	PhoneBook();
	PhoneBook(const char *_fio, const char* _mobphone);
	
	~PhoneBook();

	void ShowPhoneBook();

};
PhoneBook.cpp

Код:
#include "PhoneBook.h"

PhoneBook::PhoneBook()
{
	*FIO = 'Z';
	*MobPhone = '9';
}


PhoneBook::PhoneBook(const char* _fio, const char* _mobphone)
{
	FIO = new char[10];
	MobPhone = new char[10];
	*FIO = *_fio;
	*MobPhone = *_mobphone;
}

PhoneBook::~PhoneBook()
{
}

void PhoneBook::ShowPhoneBook()
{
	cout << "ФИО: " << FIO << endl;
	cout << "Тел: " << MobPhone << endl;
Menu.cpp


Код:
...

void MenuFun1()
{
	system("cls"); 	

	//gotoxy(25, 10);

	PhoneBook* p = new PhoneBook[3]
	{
		{"A", "9"},
		{"B", "8"},
		{"DD DD", "777"}
	};

	cout << "Телефонная книга" << endl;

	//вывод для теста контакта
	p[2].ShowPhoneBook();
	
        //деструктор
        delete[]p;

	_getch();
	system("cls");

}

...

Не могу никак понять, как скопировать полностью проинициализированный массив PhoneBook* p и вывести без мусора полностью данные {"DD DD", "777"}

Выводится первый символ и мусор.
Изображения
Тип файла: png char.png (41.2 Кб, 23 просмотров)
Farlep вне форума Ответить с цитированием
Старый 21.05.2021, 13:21   #2
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию

Проблема решена.

Все оказалось просто. Вспомнил, что char нужно прогнать циклом и в конце добавить '\0'

Код:
for (size_t i = 0; i < 5; i++)
	{
		*(FIO + i) = *(_fio + i);
		if (i == 4)
			*(FIO + i + 1) = '\0';
	}
Дальше буду делать подсчет символов и создавать массив [кол-во + 1 (под '\0')]
И прогонять количество в цикле согласно этому значению.

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

Вот это, не ругается

Код:
PhoneBook* p = new PhoneBook[3]
	{
		{"A", "9"},
		{"B", "8"},
		{"DD DD", "777"}
	};
только когда так скармливаю

PhoneBook::PhoneBook(const char* _fio, const char* _mobphone)


Как считаете нужно делать так?

Код:
PhoneBook::~PhoneBook()
{
	delete []FIO;
	delete []MobPhone;
	
}
Ведь мы выделяем память в

Код:
PhoneBook::PhoneBook(const char* _fio, const char* _mobphone)
{
	FIO = new char[10];
	MobPhone = new char[10];
	*FIO = *_fio;
	*MobPhone = *_mobphone;
}
Farlep вне форума Ответить с цитированием
Старый 21.05.2021, 13:41   #3
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию

Ну как то так, в итоге

Как то лучше это сделать можно было?

Код:
PhoneBook::PhoneBook(const char* _fio, const char* _mobphone)
{
	int count_fio, count_mobphone;
	count_fio = strlen(_fio);
	count_mobphone = strlen(_mobphone);	
	
	FIO = new char[count_fio + 1];
	MobPhone = new char[count_fio + 1];

	for (size_t i = 0; i < count_fio; i++)
	{
		FIO[i] = _fio[i];
		if (i == count_fio - 1)
			FIO[i + 1] = '\0';
	}

	for (size_t i = 0; i < count_mobphone; i++)
	{
		MobPhone[i] = _mobphone[i];
		if (i == count_mobphone - 1)
			MobPhone[i + 1] = '\0';
	}
}
Изображения
Тип файла: png fio.png (71.8 Кб, 1 просмотров)
Farlep вне форума Ответить с цитированием
Старый 21.05.2021, 14:04   #4
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию

Ушел от циклов и сократил код

Код:
PhoneBook::PhoneBook(const char* _fio, const char* _mobphone)
{
	int count_fio, count_mobphone;
	count_fio = strlen(_fio);
	count_mobphone = strlen(_mobphone);	
	
	FIO = new char[count_fio + 1];
	MobPhone = new char[count_fio + 1];

	strcpy(FIO, _fio);

	strcpy(MobPhone, _mobphone);

}
Farlep вне форума Ответить с цитированием
Старый 22.05.2021, 16:40   #5
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

Farlep, https://onlinegdb.com/ZL9xv9LMc
Алексей1153 вне форума Ответить с цитированием
Старый 13.08.2021, 16:26   #6
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от Farlep Посмотреть сообщение
Как считаете нужно делать так?

Код:

PhoneBook::~PhoneBook()
{
delete []FIO;
delete []MobPhone;

}

Ведь мы выделяем память в
Выделил – освободи. И проверь перед освобождением.
taras-proger77 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка [Error] invalid conversion from 'const char*' to 'char*' [-fpermissive]. Помогите исправить kitkat1000 Помощь студентам 1 29.01.2020 09:40
Помогите девушке! Заполнить массив случайным образом, выделить в отдельные массивы буквы латинского алфавита, Svetlana90 Помощь студентам 0 19.05.2015 14:14
C# Помогите исправить ошибку.Заполнить целочисленный массив А, не вводя значения его элементов с клавиатуры, следующим образом: serg.malkow2014 Помощь студентам 1 27.12.2013 09:54
Помогите доработать программу, заполнить массив случайными значениями . serg.malkow2014 Помощь студентам 2 27.11.2013 01:41