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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2012, 00:34   #1
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию Длинная длинная задача

Привет ребят. Опять решаю задачки попутно обучению с++ и опять вхожу в ступор... Вощем есть такое условие:
Код:
Ниже представлена общая структура программы: 
#include <iostream> 
using namespace std; 
#include <cstring> // для strlen(), strcpyO 
struct stringy { 
char * str; // указывает на строку 
int ct; // длина строки (не считая символа '\0') 
};  
// Здесь размещаются прототипы функций set() и show() 
int main () 
{ 
stringy beany; 
char testing [] = "Reality isn't what it used to be."; 
set(beany, testing); // первым аргументом является ссылка, 
// Выделяет пространство для хранения копии testing, 
// использует элемент типа str структуры beany как указатель 
// на новый блок, копирует testing в новый блок и 
// создает элемент ct структуры beany 
show(beany); // выводит строковый член структуры один раз 
show (beany, 2); // выводит строковый член структуры два раза 
testing[0] = 'D'; 
testing[1] = ' u'; 
show(testing); // выводит сроку testing один раз 
show(testing, 3); // выводит строку testing три раза 
show("Done!"); 
return 0; 
} 
Завершите программу, создав соответствующие функции и прототипы. Обратите 
внимание, что в программе должны быть две функции show (), и каждая из 
них использует аргументы по умолчанию. Где необходимо, используйте const. 
Функция set () должна использовать операцию new для выделения  
достаточного пространства памяти под хранение заданной строки. Используемые здесь 
методы аналогичны методам, применяемым при проектировании и реализации 
классов. (В зависимости от используемого компилятора, может понадобиться  
изменить имена заголовочных файлов и удалить директиву using.
Как решил её я:

Код:
============================== head.h =======================================

#ifndef HEAD_H_
#define HEAD_H_


struct stringy 
{
	char *str; 
	int ct;
};

void show(const char *, int n = 1);
void show(stringy &, int n = 1);
void set(stringy &, char *); 



#endif HEAD_H_

============================= main.cpp ======================================

#include <iostream>
#include <conio.h>
#include "head.h"
using namespace std;

int main()
{
	stringy beany;
	char testing[] = "Reality isn't what it used to be.";
	set(beany, testing);
	show(beany);
	show(beany, 2);
	testing[0] = 'D';
	testing[1] = 'u';
	show(testing);
	show(testing, 3);
	show("Done");
	cout << beany.str << "\t" << beany.ct;

	getch();
	return 0;
}

============================ funct.cpp ======================================

#include <iostream>
#include <cstring>
#include "head.h"
using namespace std;

void show(const char * txt, int n)
{
	for (int i=0; i<n; i++)
		cout << txt << endl;
}


void show(stringy & st, int n)
{
	for(int i=0; i<n; i++)
		cout << st.str << endl;
}


void set(stringy & st, char * txt)
{
        st.ct = strlen(txt) + 1;
	char *cpytxt = new char[st.ct];
	strcpy(cpytxt, txt);
	st.str = cpytxt;
	delete []cpytxt;
}
Вощем программа выполняется и тут же вылетает с какой-то ошибкой, не понятной ни мне, ни компилятору... Вощем я понел что намудрил с функцией
Код:
void set(stringy & st, char * txt)
{
        st.ct = strlen(txt) + 1;
	char *cpytxt = new char[st.ct];
	strcpy(cpytxt, txt);
	st.str = cpytxt;
	delete []cpytxt;
}
Потому что если заменить её на:
Код:
void set(stringy & st, char * txt)
{
	st.ct = strlen(txt);
	st.str = txt;
}
...то всё становится тип-топ. Но тагда не выполняется условие задачи.
Как быть? Я думаю что я просто не вкуриваю условие задачи.
Есть мысли у вас на этот счет?

Последний раз редактировалось Suby; 01.12.2012 в 00:41.
Suby вне форума Ответить с цитированием
Старый 01.12.2012, 01:40   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Подумайте сами, что вы делаете: создаете массив, в него копируете строку, убиваете массив... и пытаетесь вывести массив, а память то уже тю-тю.
p51x вне форума Ответить с цитированием
Старый 01.12.2012, 11:06   #3
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Подумайте сами, что вы делаете: создаете массив, в него копируете строку, убиваете массив... и пытаетесь вывести массив, а память то уже тю-тю.
Да, но ведь я выделяю память для массива, копирую туда строку, потом присваиваю эту копию строке структуры и только потом уже удаляю, за ненадобностью.
Suby вне форума Ответить с цитированием
Старый 01.12.2012, 12:26   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

1. Какого типа st.str?

2. Итак, что вы присваиваете в структуре?

3. Чем отличается st.str от cpytxt? Почему для одного вы выделяете память, используете strcpy, а для другого нет?
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# Длинная арифметика _Varyag_ Помощь студентам 23 21.02.2012 19:33
Задача-Паскаль. Длинная арифметика. Soko123 Помощь студентам 3 24.05.2011 20:11
Длинная арифметика nervniy Общие вопросы Delphi 4 19.04.2011 23:18
Длинная арифметика Indira Общие вопросы C/C++ 2 24.01.2010 10:28