crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> как склеить несколько char*, интересная загадка №2
enslaver
  опции профиля:
сообщение 3.10.2011, 8:17
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 30
Регистрация: 25.3.2010
Пользователь №: 1565

Спасибо сказали: 0 раз(а)




Репутация:   0  


мы имеем 2 указателя на массив символов
пусть это будет
char *argv1;

и
char *argv2;

(расписал так для большей наглядности, в действительности они так в самой программе не объявляются.)

наша задача не зная длинны этих строк, получить новый указатель:
!математически бы который выглядел так!
Цитата
carh *new;
new << argv1 << "/" << argv2;

то есть он бы содержал всю или часть 1 строки, потом всю или часть 2 строки и далее всю или часть 3 строки.

сам еще не решил данный вопрос, вот хочу узнать ваше мнение, о путях его разрешения.
(основная проблема в том что неизвестно какой длинны будет строка, а объявлять новый массив символов большой длинны нежелательно!)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2011, 8:44
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


проще всего так

#include <string>

std::string str;

str=argv1;
str+='/';
str+=argv2;

//str.c_str() - указатель на результат


Есть нюансы, связанные с производительностью, но тебе сейчас вряд ли они помешают

Сообщение отредактировал Алексей1153 - 3.10.2011, 13:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_enslaver_*_*
сообщение 3.10.2011, 13:26
Сообщение #3





Гости








    


Цитата(Алексей1153 @ 3.10.2011, 8:44) *
проще всего так

#include <string>

std::string str;

str=argv1;
str+='/';
str+=argv2;

//str.c_str() - указатель на результат


да я тоже думал так сделать, но в конечном итоге выходной указатель должен быть char *
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2011, 13:40
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


const char* p=str.c_str();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 3.10.2011, 13:45
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


В стандартной библиотеке C есть семейство функций для работы со строками. Они начинаются на str...: strcpy, strcat, strlen, ...
Вот для решения нужно две функции: strcpy + strcat.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2011, 13:51
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


BRE, это ж надо ещё рассказывать, как объявить массивы, да как с ними осторожно работать )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dovgon
  опции профиля:
сообщение 3.10.2011, 13:57
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 92
Регистрация: 5.1.2011
Пользователь №: 2325

Спасибо сказали: 3 раз(а)




Репутация:   0  


#include <string.h>

char *newStr=strcat(argv1, argv2);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
enslaver
  опции профиля:
сообщение 3.10.2011, 14:02
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 30
Регистрация: 25.3.2010
Пользователь №: 1565

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
В стандартной библиотеке C есть семейство функций для работы со строками. Они начинаются на str...: strcpy, strcat, strlen,

кто покажет где про эту библиотеку написано...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 3.10.2011, 15:32
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Dovgon @ 3.10.2011, 14:57) *
#include <string.h>

char *newStr=strcat(argv1, argv2);

А разве argv1 указывает на буфер, в который поместятся еще и символы из argv2? ;) Скорее всего нет и затрем кусок чужой памяти.

size_t len1 = strlen( argv1 );
size_t len2 = strlen( argv2 );
char *buf = malloc( len1 + len2 + 1 );                // +1 для завершающего 0
strcpy( buf, argv1 );
strcat( buf, argv2 );



Цитата(enslaver @ 3.10.2011, 15:02) *
кто покажет где про эту библиотеку написано...

Интернет или любая книга по C. :)

Сообщение отредактировал BRE - 3.10.2011, 15:32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
enslaver
  опции профиля:
сообщение 3.10.2011, 17:55
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 30
Регистрация: 25.3.2010
Пользователь №: 1565

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(BRE @ 3.10.2011, 16:32) *
char *buf = malloc( len1 + len2 + 1 ); // +1 для завершающего 0


На сколько я знаю malloc уже не используется вмеcто него теперь используют new и delete.
Если я неправ то разъясните по этому вопросы, и какую директиву нужно тут использовать, так как у меня при компиляции выдает
Цитата
../src/copy.cpp:73:37: ошибка: нет декларации «malloc» в этой области видимости


Цитата(enslaver @ 3.10.2011, 18:47) *
Цитата(BRE @ 3.10.2011, 16:32) *
char *buf = malloc( len1 + len2 + 1 ); // +1 для завершающего 0


На сколько я знаю malloc уже не используется вмеcто него теперь используют new и delete.
Если я неправ то разъясните по этому вопросы, и какую директиву нужно тут использовать, так как у меня при компиляции выдает
Цитата
../src/copy.cpp:73:37: ошибка: нет декларации «malloc» в этой области видимости



заработало после подключения stdlib.h
#include<stdlib.h>

и изменением вашего объявление на
char *b=(char*)malloc(slen1 + len2 + 1);


наверно мне стоило раньше сказать но я пишу на C++
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.4.2024, 17:27