Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.67
Jawello
1 / 1 / 0
Регистрация: 26.05.2009
Сообщений: 18
#1

Копирование из массива строк в строку - C++

26.05.2009, 00:40. Просмотров 4281. Ответов 9
Метки нет (Все метки)

Есть динамический массив строк.Двумерный.И есть "координаты"(положение символа(i,j) начала выделения и конца),нужно скопировать в одномерный массив символов(тоже динамический) все символы между началом и концом. еще уточнение,каждая строка длиной 72 символа..тоесть столько выделенно памяти,под каждую строку,но действительно строка может закончится и раньше(символ '\0') ..после этого символа скорее всего муссор.нужно чтобы при копировании этот муссор не забирался.прошу предложить вараинты или код.

за ранее спасибо

п.с. я пробывал установить два указателя один на начало ,другой на конец...и бежать и по массиву до тех пор пока первый указатель не сравняется с конечным.если часть нужная для копирования в пределах одной строки,все копируется нормально.но если начало на одной строке а конец на другой...то копирование происходит только до конца 1ой строки.

п.п.с. Visual Studio 2008 . КОнсольное приложение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2009, 00:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Копирование из массива строк в строку (C++):

Копирование строк из одного массива в другой - C++
Здравствуйте, друзья) Пишу: class CopyString { private: static const int Max = 20; char StrFirst; char...

Удалить из массива строк самую короткую строку - C++
Сформировать массив строк разной длины. Удалить из него самую короткую строку.

Используя функцию копирования строк, организуйте конкатенацію и копирование строк в четвертый массив, содержащий полные имена - C++
Пожалуйста с этим заданием. Написать программу, которая описывает четыре массива. Три первых массива должны содержать имена, фамилии и...

Копирование строк - C++
Всем доброго времени суток. У меня такой вопрос как можно копировать строка в строку не с заменой, а с добавлением в строку. например...

Копирование строк - C++
И опять столкнулся с проблемой. Описываю функцию, которая копирует k символов из строки str в строку s. Вот мой код: void...

копирование строк - C++
Как на языке Си скопировать из строки s1 в строку s2 n символов с k-ой позиции?

9
Deiron
26 / 26 / 1
Регистрация: 25.05.2009
Сообщений: 98
26.05.2009, 12:22 #2
Не совсем ясно, каким именно образом ты в двухмерном массиве указываешь координаты начала и конца выделения всего двумя символами. Тут нужно либо 4 координаты (i начала,j начала,i конца,j конца), либо я не понимаю, в чем суть твоей задачи.
С копированием в пределах нескольких строк все более менее просто. Если идти "в лоб", то надо сделать следующее:
C++
1
2
3
4
5
6
7
8
9
strcpy(result,arr[i_start]+j_start);
for (i=i_start+1,i<i_end;i++){
 strcat(result,arr[i]);
}
char* temp=new char[72];
strncpy(temp,arr[i_end],j_end+1);
temp[j_end+1]='\0';
strcat(result,temp);
delete [] temp;
после этого в result будет то, что тебе нужно. Правда в данном примере не учтен случай копирования в пределах одной строки. Но он делается вообще элементарно:
C++
1
2
strncpy(result,arr[i_start]+j_start,j_end-j_start+1);
result[j_end-j_start+1]='\0';
1
Jawello
1 / 1 / 0
Регистрация: 26.05.2009
Сообщений: 18
26.05.2009, 14:37  [ТС] #3
спасибо.да, ты праивильно понял по поводу условия.

я хотел уточнить вопрос по поводу записи strcpy(result,arr[i_start]+j_start); - arr[i_start]+j_start я так понял это он начнет копирование именно с начального элемента в начальной строке? ...тоесть по сути мы в функцию передаем указаетль на элемент а она уже копирует все до конца строки? ...я так понимаю передаем мы указатель на строку?! ...вообщемпрошу объяснить именно смысл.

strncpy - копирует от начала строки на который передали указатель,переданное кол-во элементов?(я не говорю про первый параметр,в него мы просто копируем,это понятно).\

еще раз спасибо.

п.с. а первый способ на мой взгляд должен и сработать,если копирование произойдет и в пределах одной строки.это так? просто в зависимости от действий пользователя копирование может произойти, как в предах одной строки, так и нет.
0
Deiron
26 / 26 / 1
Регистрация: 25.05.2009
Сообщений: 98
26.05.2009, 16:25 #4
Да, все верно. arr[i_start] - адрес начала строки, следовательно arr[i_start]+j_start это адрес элемента arr[i_start][j_start]. У strncpy следующие параметры:
("куда", "откуда", "сколько"). '\0' она не добавляет. Поэтому, тут нужен контроль.

Первый способ в случае одной строки скопирует всю строку с j_start до конца
C++
1
strcpy(result,arr[i_start]+j_start);
А затем добавит еще одну строку
C++
1
2
3
strncpy(temp,arr[i_end],j_end+1);
temp[j_end+1]='\0';
strcat(result,temp);
То есть, если мы захотим получить из строки "мама мыла раму" строку "мыла", то по результатам работы моей "1й" программы получится "мыла рамумыла"
1
Jawello
1 / 1 / 0
Регистрация: 26.05.2009
Сообщений: 18
27.05.2009, 04:27  [ТС] #5
спасибо.плохо,что до самого не дошло.недосып. это уже офф топ.
по теме. теперь у меня следующее затруднение.вот эту строку которую мы скопировали нужно вставить в любоем место массива(есть координаты,опять (i,j),после этого символа нужно сделать вставку ).один способ в голове есть,но он крайне дуболомный и некрасивый.а именно создать еще один массив до этого элемента все скопировать из старого,потом запихнуть строку(по символьно и если вдруг кол-во превысит длину в 72 символа,то перейти на след и т.д.),а потом продолжить копировние из старого.вот и все.в пол 5ого утра ни че более дельнего и просто в голову не лезет.

и как всегда,за ранее,спасибо.
0
Deiron
26 / 26 / 1
Регистрация: 25.05.2009
Сообщений: 98
28.05.2009, 02:01 #6
ну... вставка элемента в середину массива всегда была огромнейшей проблемой. Это вам не список, в котором можно выдергивать откуда угодно и впихивать куда угодно.
В принципе, ваш путь верен... можно сделать так:
1. Копируем все элементы начиная с (i,j+1) Куда угодно. (например во временный двумерный массив символов)
2. делаем strncpy(arr[i]+j+1,src,72-j-2); (один символ нужен под \0)
3. далее, если 72-j-2>=strlen(src) можем спокойно впихивать остатки старого массива со следующей строки (strcpy тебе в помощь)
Впрочем, если двумерный массив и правда динамический(то есть может "достраиваться"), то и со случаем когда 72-j-2<strlen(src) разобраться не сложно.
Остатки src пихаем в следующую строку, а после этого построчно впихиваем остатки старого массива. Впрочем, даже если это и не так, думаю с помощью strncat и strncpy ты сможешь найти решение своей проблемы.

Так же возможно ее решить, если обрабатывать двумерный массив, как одномерный.
Тогда алгоритм проще, но хитрей:
1. временно копируем весь "хвост" массива.
2. вместо хвоста вставляем запомненный участок
3. к концу запомненного участка присобачиваем запомненый "хвост".
4. превращаем одномерный массив обратно в двумерный
1
Jawello
1 / 1 / 0
Регистрация: 26.05.2009
Сообщений: 18
01.06.2009, 22:25  [ТС] #7
извиняюсь,за то что долго реагировал.экзамены.

"превращаем одномерный массив обратно в двумерный" - а можно узнать как?и обратное превращение?

спасибо.
0
Deiron
26 / 26 / 1
Регистрация: 25.05.2009
Сообщений: 98
02.06.2009, 12:33 #8
На самом деле, такой алгоритм даже сложнее, чем первый и никаких преимуществ не дает. В данном алгоритме довольно запарно копировать куда-то хвост. Изначально я думал, что может получиться более короткий алгоритм за счет того, что можно
1. "впихнуть начало"
2. с помощью strcat добавлять к нему строки хвоста до тех пор, пока хвост не кончится.

Но я не учел, что надо заботится о \0 и о многом другом. В общем, откровенно говоря, со вторым алгоритмом я ступил.
0
Jawello
1 / 1 / 0
Регистрация: 26.05.2009
Сообщений: 18
04.06.2009, 22:57  [ТС] #9
ну после долгого сношения со своим кодом,я все таки его довлел до работоспосбности) спасибо огромное за помощь и поддержку.

а по поводу второго алгоритма,я так понял,что мы просто настраиваем указатель на начало массива и бежим по нему как по одномерному? ...ну да,тут проблема с концом строки)...

Deiron, если у меня возникнут вопросы по поводу визуального программирования с использованием мфс,смогу я к вам обратиться?
0
Deiron
26 / 26 / 1
Регистрация: 25.05.2009
Сообщений: 98
05.06.2009, 13:38 #10
Откровенно говоря, до сих пор я не работал с МФС (которые лучше все же писать как MFC). Как студенту, мне это не требовалось, а "хлеб" я в основном как PHP - программист зарабатывал. Но если чем-нибудь смогу помочь - помогу
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2009, 13:38
Привет! Вот еще темы с ответами:

Копирование Строк - C++
В общем, я продолжаю разборки с С(++) и у меня снова вопрос, ответ на который ув. тов. Google не дал. Гад! Задача: даны три строки,...

Копирование строк - C++
Нужно сравнить две строки не учитывая пробелы. Ошибка где-то в копировании a1 в с1 #define _CRT_SECURE_NO_WARNINGS #include...

Копирование строк - C++
У Страуструпа приведен такой пример для копирования одной строки в другую: void cpy (char* p, const char* q) { while...

копирование строк - C++
Скопировать из файла F1 в файл F2 все строки, кроме той строки, в которой больше всего гласных букв. Ну или просто скопировать строку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
05.06.2009, 13:38
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru