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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2013, 16:02   #1
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию помогите создать функцию для выделения новой памяти для строки

Задача: Есть 2 строки. Вторую надо скопировать в первую. предварительно их передать в функцию и выделить новую память для первой строки.
Мой код работает, но, во-первых, не пойму почему не могу удалить память в функции перед тем как выделить новую? и во-вторых, в конец итоговой строки дописывает еще 9 символов "мусора". Подскажите в чем ошибка.

Код:
#include <iostream>
#include <string.h>
using namespace std;

char *newMem(char*, char*);

int main()
{
	setlocale(LC_ALL, "rus");

	char *str1 = new char [(strlen("строка 1") + 1)] = "строка 1";
	

	char *str2 = new char [(strlen(" + строка 2") + 1)] = " + строка 2";

cout << "1)" << str1 << endl;
cout << "2)" << str2 << endl << endl;

	char str[9] = "";//для копирования строки str1 перед удалением памяти 
	
	int x = 0;//управляющая переменная
	while (str1[x] != '\0')
	{
		str[x] =  str1[x];//копируем строку
		x++;
	}

	cout << "копия str: " << str << endl;

	
	str1 = newMem(str1, str2);//функция, которая перевыделит память

	x = 0;
		while (str[x] != '\0') 
		{
			str1[x] = str[x];
			x++;
		}
		int y = 0;
		while (str2[y] != '\0')
		{
			str1[x] = str2[y];
			y++;
			x++;
		}

		cout << "Итоговая строка: " << str1 << endl << endl;

return 0;
}

char *newMem(char *pstr1, char *pstr2)
{
	int lenPstr1 = strlen(pstr1) + 1;//длина строки pstr1 c '\0'
	int lenPstr2 = strlen(pstr2) + 1;


	int newSize = lenPstr1 + lenPstr2;//21 
	

	//delete  pstr1;//освобождаем память перед выделением новой памяти для 2х строк
		
	pstr1 = new char [newSize];

	return pstr1;
}

Последний раз редактировалось marenko.lilia; 25.12.2013 в 16:21.
marenko.lilia вне форума Ответить с цитированием
Старый 25.12.2013, 16:08   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

char *str1 = new char [(strlen("строка 1") + 1)] = "строка 1";
Это что, по вашему?
Так строки не копируются, воспользуйтесь strcpy()
waleri вне форума Ответить с цитированием
Старый 25.12.2013, 16:16   #3
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
char *str1 = new char [(strlen("строка 1") + 1)] = "строка 1";
Это что, по вашему?
Так строки не копируются, воспользуйтесь strcpy()
Код:
int main()
{
	setlocale(LC_ALL, "rus");

	char *str1 = new char [(strlen("строка 1") + 1)];
	strcpy(str1, "строка 1");

	char *str2 = new char [(strlen(" + строка 2") + 1)];
	strcpy(str2, " + строка 2");
сделала! ситуация не изменилась
marenko.lilia вне форума Ответить с цитированием
Старый 25.12.2013, 16:58   #4
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
По умолчанию

А 21 и должно вывести, ибо:
Код:
	int lenPstr1 = strlen(pstr1) + 1;//длина строки pstr1 c '\0'
	int lenPstr2 = strlen(pstr2) + 1;
Зачем дважды прибавлять 1 Это делается ТОЛЬКО 1 раз!
Чуток "причесанный" код:
Код:
#include <iostream>
#include <string.h>
using namespace std;

char *newMem(char*, char*);

int main()
{
	setlocale(LC_ALL, "rus");

	char *str1 = new char [(strlen("строка 1") + 1)];
	strcpy(str1, "строка 1");

	char *str2 = new char [(strlen(" + строка 2") + 1)];
	strcpy(str2, " + строка 2");

    cout << "1)" << str1 << endl;
    cout << "2)" << str2 << endl << endl;

	char str[9] = "";//для копирования строки str1 перед удалением памяти

	int x = 0;//управляющая переменная
	while (str1[x] != '\0')
	{
		str[x++] =  str1[x];//копируем строку
	}

	cout << "копия str: " << str << endl;


	str1 = newMem(str1, str2);//функция, которая перевыделит память

	x = 0;
    while (str[x] != '\0')
    {
        str1[x++] = str[x];
    }
    int y = 0;
    while (str2[y] != '\0')
    {
        str1[x++] = str2[y++];
    }

    cout << "Итоговая строка: " << str1 << endl << endl;
    cout << strlen(str1) <<endl;

return 0;
}

char *newMem(char *pstr1, char *pstr2)
{
	int lenPstr1 = strlen(pstr1);//длина строки pstr1 c '\0'
	int lenPstr2 = strlen(pstr2);


	int newSize = lenPstr1 + lenPstr2 + 1;
    cout << "newSize=" << newSize <<endl; //20


	//delete  pstr1;//освобождаем память перед выделением новой памяти для 2х строк

	pstr1 = new char [newSize];

	return pstr1;
}
Результат:
Код:
1)строка 1
2) + строка 2

копия str: строка 1
newSize=20
Итоговая строка: строка 1 + строка 2

19
Все ОК, отработало нормально.

Последний раз редактировалось andreil; 25.12.2013 в 17:04.
andreil вне форума Ответить с цитированием
Старый 25.12.2013, 17:06   #5
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от marenko.lilia Посмотреть сообщение
во-первых, не пойму почему не могу удалить память в функции перед тем как выделить новую?
В чём это выражается? У меня, при раскомментировании строчки с удалением, всё сработало нормально.
В какой среде собираете? Я использую дефолтный GCC, а у Вас, наверное MSVC какой-нибудь
andreil вне форума Ответить с цитированием
Старый 25.12.2013, 17:11   #6
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Спасибо, andreil!
но опять же в итоге cout << strlen(str1) <<endl; не 20, как нам надо, а 31 показывает и "мусор" остался.

1)строка 1
2) + строка 2

копия str: строка 1
newSize=20
Итоговая строка: строка 1 + строка 2Нээээ\Х4V`.☻

31
Для продолжения нажмите любую клавишу . . .

Последний раз редактировалось marenko.lilia; 25.12.2013 в 17:16.
marenko.lilia вне форума Ответить с цитированием
Старый 25.12.2013, 17:12   #7
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Цитата:
Сообщение от andreil Посмотреть сообщение
В чём это выражается? У меня, при раскомментировании строчки с удалением, всё сработало нормально.
В какой среде собираете? Я использую дефолтный GCC, а у Вас, наверное MSVC какой-нибудь
да, у меня "MSV какой-нибудь" )))

после того, как ты изменил код - память удалилась нормально! Наверное причина была в том одном '\0'... сейчас буду разбираться

Последний раз редактировалось marenko.lilia; 25.12.2013 в 17:18.
marenko.lilia вне форума Ответить с цитированием
Старый 25.12.2013, 17:20   #8
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
По умолчанию

Добавь перед выводом:
Код:
str1[x] = '\0';
Это немного не правильно, но сработать должно...
andreil вне форума Ответить с цитированием
Старый 25.12.2013, 17:21   #9
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

andreil, вот я прямо беру твой код копирую, запускаю и ...


1)строка 1
2) + строка 2

копия str: строка 1
newSize=20
Итоговая строка: строка 1 + строка 2Нээээ\Х4V`.☻

31
Для продолжения нажмите любую клавишу . . .
marenko.lilia вне форума Ответить с цитированием
Старый 25.12.2013, 17:24   #10
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Цитата:
Сообщение от andreil Посмотреть сообщение
Добавь перед выводом:
Код:
str1[x] = '\0';
Это немного не правильно, но сработать должно...
да, конечно, так все красиво показывает )))))

но это и правда немного неправильно
marenko.lilia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
написать фрагмент программы выделения памяти для 2-мерного массива из N строк ( С++ ) Niklitel Помощь студентам 4 15.11.2013 16:12
Макрос для вставки новой строки Maiku Microsoft Office Excel 6 15.03.2013 18:28
Не могу сделать функцию для строки Донат Общие вопросы C/C++ 1 07.12.2011 20:08
Функции для выделения, перераспределения и освобождения памяти ArtGrek Общие вопросы Delphi 9 14.03.2011 03:08
Новый двухкнопочный калькулятор для новой операционной системы. Пишем новые программы для BolgenOS. Ecosasha Софт 16 06.06.2010 13:32