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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2011, 11:48   #1
c0zak
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 36
По умолчанию C++ динамическая строка

Нужно написать процедуру считывания строчки из консоли, количество символов заранее неизвестно. Мой код:
Код:
int setstr(char *str,int i)
	{
		char letter=1;
		int k; i=1;
		char *str1=new char[sizeof(str)];
		char *str2=str1;
		while (letter!=10)
		{letter=cin.get();
		str1[i-1]=letter;
		i++;
		str2=str1;
		char *str1=new char[i];
		for(k=0;k<i;k++) {str1[k]=str2[k];}
		delete(str2);
}
		str1[i-1]=0;
		return i;
}
На втором жаге цикла вылет-
locknum CXX0030: ошибка: невозможно вычислить выражение

При дебаге какая то фигня:
+ str 0x00347fa8 "Нээээ««««««««юою" char *
i 2 int
+ str2 0x00347fe8 "fНННээээ««««««««" char *
k -858993460 int
letter 102 'f' char
+ str1 0xcccccccc <Неправильный указатель> char *
+ str1 0x00347fe8 "fНННээээ««««««««" char *




+ str 0x00347fa8 "Нээээ««««««««юою" char *
i 2 int
+ str2 0x00347fe8 "оюоюоюоюоюоюоюоюоюоюоюою" char *
k 2 int
letter 102 'f' char
+ str1 0x00345c90 "fНээээ««««««««ою" char *
+ str1 0x00347fe8 "оюоюоюоюоюоюоюоюоюоюоюою" char *


Я не могу понять откуда берётся копия указателя, думаю ошибка как раз из-за него, т.к. на втором шаге процедура пишет символ уже в него 0_о. Очень прошу мне объяснить что это за фигня, а то крыша едет =(. Всем заранее спасибо.
Твои сны-как лотерея, это то что мы умеем... ©СЛОТ
c0zak вне форума Ответить с цитированием
Старый 05.11.2011, 13:23   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Например, так можно:
Код:
const int STRING_SIZE_DELTA = 2;

char *ReadString()
{
	int l = 0, buffl = STRING_SIZE_DELTA;
	char *str = (char*)malloc(buffl);
	char c = std::cin.get();
	while(c != 10)
	{
		if(l >= buffl)
		{
			str = (char*)realloc(str, buffl + STRING_SIZE_DELTA);
			buffl += STRING_SIZE_DELTA;
		}
		str[l] = c;
		l++;
		c = std::cin.get();
	}
	str = (char*)realloc(str, l+1);
	str[l] = 0;
	return str;
}
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 05.11.2011, 16:42   #3
c0zak
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 36
По умолчанию

Спасибо =) прекрасно подошло =) а где можно поподробнее узнать про malloc и realloc?
Твои сны-как лотерея, это то что мы умеем... ©СЛОТ
c0zak вне форума Ответить с цитированием
Старый 05.11.2011, 16:52   #4
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Ну, узнавать-то там особо нечего:
malloc(int n) - выделяет память в количестве, указанном в параметре (в байтах).
realloc(void *p, int n) - перевыделяет память в размере n байт, и при этом копирует из p те данные, которые уже там содержались
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая строка Сергей089 C++ Builder 15 10.12.2009 20:32
Динамическая строка!!! Пожалуйста...=)) y.barninets Помощь студентам 1 08.12.2009 18:06
динамическая строка в консоле win32 AlexeyLed Общие вопросы C/C++ 4 10.03.2009 12:39
Строка состаяния или загрузачная строка Sergeu Мультимедиа в Delphi 8 27.08.2008 10:32
Класс Динамическая строка по Си Zolotce Помощь студентам 1 26.04.2008 18:58