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

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

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

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

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

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

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

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

п.п.с. Visual Studio 2008 . КОнсольное приложение.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deiron
25 / 25 / 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';
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 - копирует от начала строки на который передали указатель,переданное кол-во элементов?(я не говорю про первый параметр,в него мы просто копируем,это понятно).\

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

п.с. а первый способ на мой взгляд должен и сработать,если копирование произойдет и в пределах одной строки.это так? просто в зависимости от действий пользователя копирование может произойти, как в предах одной строки, так и нет.
Deiron
25 / 25 / 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й" программы получится "мыла рамумыла"
Jawello
1 / 1 / 0
Регистрация: 26.05.2009
Сообщений: 18
27.05.2009, 04:27  [ТС]     Копирование из массива строк в строку #5
спасибо.плохо,что до самого не дошло.недосып. это уже офф топ.
по теме. теперь у меня следующее затруднение.вот эту строку которую мы скопировали нужно вставить в любоем место массива(есть координаты,опять (i,j),после этого символа нужно сделать вставку ).один способ в голове есть,но он крайне дуболомный и некрасивый.а именно создать еще один массив до этого элемента все скопировать из старого,потом запихнуть строку(по символьно и если вдруг кол-во превысит длину в 72 символа,то перейти на след и т.д.),а потом продолжить копировние из старого.вот и все.в пол 5ого утра ни че более дельнего и просто в голову не лезет.

и как всегда,за ранее,спасибо.
Deiron
25 / 25 / 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. превращаем одномерный массив обратно в двумерный
Jawello
1 / 1 / 0
Регистрация: 26.05.2009
Сообщений: 18
01.06.2009, 22:25  [ТС]     Копирование из массива строк в строку #7
извиняюсь,за то что долго реагировал.экзамены.

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

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

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

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

Deiron, если у меня возникнут вопросы по поводу визуального программирования с использованием мфс,смогу я к вам обратиться?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2009, 13:38     Копирование из массива строк в строку
Еще ссылки по теме:

Копирование строк C++
Копирование строк C++
Копирование строки в строку C++
C++ Удалить из массива строк самую короткую строку
C++ Копирование строк

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

Или воспользуйтесь поиском по форуму:
Deiron
25 / 25 / 1
Регистрация: 25.05.2009
Сообщений: 98
05.06.2009, 13:38     Копирование из массива строк в строку #10
Откровенно говоря, до сих пор я не работал с МФС (которые лучше все же писать как MFC). Как студенту, мне это не требовалось, а "хлеб" я в основном как PHP - программист зарабатывал. Но если чем-нибудь смогу помочь - помогу
Yandex
Объявления
05.06.2009, 13:38     Копирование из массива строк в строку
Ответ Создать тему
Опции темы

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