Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Академик
Рейтинг: 8741
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2911
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2566
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1695
Дата выхода:10.11.2011, 22:30
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:282 / 162
Вопросов / ответов:1 / 1

Консультация # 184386: Уважаемые эксперты! Пожалуйста, ответьте на вопрос (ибо нет времени - и так завал полный): Программка нужна под VS 2008. Задачка такая (пишу как есть): С клавиатуры вводятся строки до того момента, пока не введен символ Пробел. Сколько строк -- изначально неизвестно. Нужно их сохранить таким образом, чтобы было char **str и in...


Консультация # 184386:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос (ибо нет времени - и так завал полный):

Программка нужна под VS 2008.

Задачка такая (пишу как есть):

С клавиатуры вводятся строки до того момента, пока не введен символ Пробел. Сколько строк -- изначально неизвестно. Нужно их сохранить таким образом, чтобы было char **str и int count, так что в str[0], str[1], ..., str[count - 1] лежали указатели на считанные строки, память отведена с помощью new.

Требуется реализовать так: заводим большой временный буфер (1 кб) для текущей вводимой строки, считываем туда строку с клавиатуры (считаем, что _одна_ строка < 1 кб). Отводим массив длины strlen(...) + 1 и копируем туда введённую строку.
Есть информация, сколько указателей может хранить "внешний" массив. Если он ещё не переполнился, то кладём туда указатель на строчку и увеличиваем count. А иначе сначала заводим массив в два раза большего размера, копируем туда старые указатели, уда ляем старый массив, а уже в новый массив кладём указатель. Задача состоит в том, чтобы отвести память "кусочно", сразу целым большим участком.

Спасибо за ответ. Если ответ будет что надо - повышу плату (пусть пока на минимуме будет).

Дата отправки: 05.11.2011, 21:57
Вопрос задал: Amfisat (3-й класс)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Александр (2-й класс):

Здравствуйте, Amfisat!

Код :
#include <string.h>

# define blocksize 5; // Задаем константой размер блока

char **strarray = NULL;	// Глобальный указатель на массив строк
int count = -1;			// Индекс последнего элемента
int size = 0;			// Размер массива

void Resize()  //Процедура расширения массива
{
	char **newarray = NULL;
	int newsize = size+blocksize;

	newarray = new char*[newsize];	// Выделяем память
	if (size!=0)
	{
	memcpy (newarray,strarray,size*4);		// Копируем содержимое старого в новый
	delete [] strarray;						// Освобождаем память
	}
	strarray = newarray;					// Меняем указатель
	size = newsize;							// Новый размер массива
	
}

void AddString (char *string) // Функция добавления строки к массиву
{
	int slen = 0;
	count++;
	if (size==count) Resize(); // Если указатели массива закончились, то увеличиваем размер
	slen = strlen(string);		// Вычисляем длину строки
	strarray[count] = new char[slen+1]; // Выделяем память под строку
	strcpy(strarray[count],string); // Копируем строку
}

void Free()      
{
	for (int i=0; i<=count; i++)
		delete [] strarray[i];
	delete [] strarray;
	count = -1;
	size =0;
	strarray = NULL;
}
int main(int argc, char* argv[])
{
	AddString("Один");
	AddString("Два");
	AddString("Три");
	AddString("Четыре");
	AddString("Пять");
	AddString("Шесть");
	AddString("Семь");

	char *t = strarray[3];
	t = strarray[6];
	t = strarray[2];
	Free();

	return 0;
}

Консультировал: Александр (2-й класс)
Дата отправки: 06.11.2011, 00:12

5
нет комментария
-----
Дата оценки: 07.11.2011, 08:12

Рейтинг ответа:

НЕ одобряю +1 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное