Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как склеить несколько char*
Форум на CrossPlatform.RU > Разработка > С\С++
enslaver
мы имеем 2 указателя на массив символов
пусть это будет
char *argv1;

и
char *argv2;

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

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

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

сам еще не решил данный вопрос, вот хочу узнать ваше мнение, о путях его разрешения.
(основная проблема в том что неизвестно какой длинны будет строка, а объявлять новый массив символов большой длинны нежелательно!)
Алексей1153
проще всего так

#include <string>

std::string str;

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

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


Есть нюансы, связанные с производительностью, но тебе сейчас вряд ли они помешают
Гость_enslaver_*
Цитата(Алексей1153 @ 3.10.2011, 8:44) *
проще всего так

#include <string>

std::string str;

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

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


да я тоже думал так сделать, но в конечном итоге выходной указатель должен быть char *
Алексей1153
const char* p=str.c_str();
BRE
В стандартной библиотеке C есть семейство функций для работы со строками. Они начинаются на str...: strcpy, strcat, strlen, ...
Вот для решения нужно две функции: strcpy + strcat.

Алексей1153
BRE, это ж надо ещё рассказывать, как объявить массивы, да как с ними осторожно работать )
Dovgon
#include <string.h>

char *newStr=strcat(argv1, argv2);
enslaver
Цитата
В стандартной библиотеке C есть семейство функций для работы со строками. Они начинаются на str...: strcpy, strcat, strlen,

кто покажет где про эту библиотеку написано...
BRE
Цитата(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. :)
enslaver
Цитата(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++
Litkevich Yuriy
Цитата(enslaver @ 3.10.2011, 20:55) *
На сколько я знаю malloc уже не используется вмеcто него теперь используют new и delete.
переделать код не сложно:
char *buf = new char[len1 + len2 + 1]; // +1 для завершающего 0
Dovgon
Цитата(BRE @ 3.10.2011, 15:32) *
Цитата(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. :)


http://ru.wikipedia.org/wiki/String.h
enslaver
спасибо за помощь решение выглядит так

char *n=new char[SIZE];

и функия
char *new_string(char *out,char *in){
    int i=0,n=size_char(out);
    for(i=0;in[i]!='\0';i++){
        out[n+i]=in[i];
    }
    return out;
}


всем спасибо за помощь.
Алексей1153
enslaver, какова цель создания этого куска кода ? Учебная ? Для работы ?
enslaver
В данный момент своими силами изучаю С++, и пока все пишу в учебных целях для того что бы набить руку.
Именно по этому предпочитаю во многом отказываться от использования алгоритмов, контейнеров и методов в СТД, хочу сам дойти до них прежде чем их использовать.
RR42
Цитата
char *new_string(char *out,char *in){
int i=0,n=size_char(out);
for(i=0;in[i]!='\0';i++){
out[n+i]=in[i];
}
return out;
}


<stdlib.h>
<string.h>
memcpy
strlen

Можешь сначала длину строк посчитать + 1, затем memcpy, либо, если хочешь производительности, берешь огромный буффер, по заполнении буффера делаешь всё, что и всегда. Ну это я на вскидку. Посмотри еще strdup - копирование строк. Это всё си, а не плюсы. В юниксах вместо memcpy есть bcopy, но я так и не понял чем он лучше.
Да, хорошее начинание - с чистого си. Потом освой Qt, понравится. Ну STL, само собой. Придется в любом случае.
Алексей1153
Цитата
Да, хорошее начинание - с чистого си

совет сомнительной полезности )) Лучше всё же с C++ , а то останутся вредные привычки

про "огромный буфер" и "всё, что и всегда" - тоже непонятно, что имелось в виду
Iron Bug
Цитата(Алексей1153 @ 16.10.2011, 13:00) *
а то останутся вредные привычки

какие это ещё "вредные привычки" в Си?
Алексей1153
Iron Bug, в самом Си они не вредные, но когда их начинают применять в C++ , они становятся вредными. К примеру, копирование тела экземпляра не оператором = , а побайтно. Если область применения Си обычно поощряет всякие "оптимизационные хитрости", так как там это действительно часто требуется (контроллеры, где используются несложные компиляторы или мало ресурсов) , то на C++ обычно пишут под производительное железо, где много ресурсов, мощный и умный компилятор (который сам заоптимизирует так, что разоптимизировать придётся)
Iron Bug
а чем побайтное копирование не устраивает? если это memcpy (ну или там bcopy в юниксе), то какая баня? разница есть только когда используются классы с хитрыми конструкторами копирования. но это ж сам программист решает, где как лучше копировать. а напрямую всегда быстрее. быстрее - это ВСЕГДА лучше. и не надо заливать про "умный компилятор". умный компилятор не предполагает тупого и ленивого программиста :) к тому же, вот мне как-то пришлось именно выделять буфер под представитель класса и ручками вызывать конструктор (это в некоторых случаях так хитро можно грузить классы из библиотек, когда по-другому нельзя). так что уметь нужно всё и использовать разумно. тогда и проблем не будет.
Алексей1153
Iron Bug, не, я же не спорю, что случаи разные бывают. Насчёт же побайтового копирования - неважно, класс это или структура (это одно и то же) , если добавилась хоть одна виртуальная функция, то всё валится нахрен, и спорить тут не о чем :) Одно это уже много проблем создаст.

Насчёт умных компиляторов - я не имел в виду настолько умных ) Только явные оптимизации
Iron Bug
Цитата(Алексей1153 @ 17.10.2011, 22:31) *
неважно, класс это или структура (это одно и то же)

это теоретически одно и то же. а на деле компиляторы имеют мелкие отличия. в частности, мелкософт не принимает списка инициализации в конструкторе структуры. и вот хоть тресни. это так, к слову. просто недавно напоролась. так что нифига они не равны и всё зависит от компилятора.

при копировании побайтно все указатели (в том числе и указатель на таблицу виртуальных функций) будут просто скопированы. пока области памяти, на которые они ссылаются, живы - ничего страшного не случится. конечно, трудно придумать применение для таких вещей и сложно их отслеживать. но иногда бывает нужно подменять виртуальные таблицы вручную или вызвать какой-то метод напрямую через адрес, или запихать его в стек или ещё что-то такое подобное. просто нужно понимать механизмы работы классов и знать, что ты делаешь.
Алексей1153
Цитата
в частности, мелкософт не принимает списка инициализации в конструкторе структуры. и вот хоть тресни.


первый раз такое слышу.
struct A
{
    int i1;
    int i2;
    A(int i1,int i2):i1(i1),i2(i2)
    {
    }
};


struct B:A
{
    B(int i1,int i2):A(i1,i2)
    {
    }
};

B b(1,2);

Нажмите для просмотра прикрепленного файла
Iron Bug
значит, у меня компилятор на большом проекте в очередной раз глюканул. он глючит, когда начинает собирать много библиотек в один заход. иногда просто зависает, иногда не может разрулить связи, хотя зависимости проектов проставлены. иногда надо вручную чистить всю его служебную информацию по проекту, чтобы он сожрал код.
но он мне прямо так и написал: мол, нельзя тут список инициализации использовать. вообще, это один из самых ненавистных для меня компиляторов: много непонятных и неожиданных багов и неоптимальный код на выходе.
Алексей1153
Iron Bug, а ты чем пользуешься ? И где описание структуры расположено - может от компилятору этого есть разница, хз )

В студии бывает, что глюкнет и отказывается компилить, но закрываешь проект, удаляешь ncb, потом всё компилится
Iron Bug
Цитата(Алексей1153 @ 19.10.2011, 12:24) *
В студии бывает, что глюкнет и отказывается компилить, но закрываешь проект, удаляешь ncb, потом всё компилится

иногда там не только их вроде удалять нужно. мне пока некогда разбираться, у меня работы дофига. вроде с тридесятого раза она сожрала проект. правда, я не знаю, какое конкретно шаманство привело её в рабочее состояние :)
Алексей1153
Iron Bug, ты, наверное, его мало выгуливаешь, вот он и кочевряжится )))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.