Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > как соединить char x[j] + char y[i] ???


Автор: Syberex 29.3.2007, 14:55
в общем есть такое 

Код

char[50]="hhhhhhhhh";
char[80]="jjjjjjjj";


как мне соединить их вместе? чтоб было hhhhhhhhhjjjjjjjj, т.е соединить и данные занести либо в char[ i],т.е заранее определённого рамера , либо динамически new x[y];

как? 

Автор: Partizan 29.3.2007, 15:01
Код

strcat()

Автор: JackYF 29.3.2007, 15:02
мдя. Ну несколько раз уже было:

Код

char a[50]="hhhhhhhhh";
char b[80]="jjjjjjjj";

char* с = new char[50+80+1];
strcpy(c, a);
strcat(c, b);


А вообще не 50 и 80, а константы нужно указывать smile.

Автор: Syberex 29.3.2007, 15:11
супер, всё работает, сенкс  smile 

Автор: JAnty 29.3.2007, 15:11
Код

char a[50]="hhhhhhhhh";
char b[80]="jjjjjjjj";
char *c;
c=strcat(a,b);


c=hhhhhhhhhjjjjjjjj

Автор: Partizan 29.3.2007, 15:16
Цитата(JAnty @ 29.3.2007,  15:11)
Код

char a[50]="hhhhhhhhh";
char b[80]="jjjjjjjj";
char *c;
c=strcat(a,b);


c=hhhhhhhhhjjjjjjjj

неправильный ваш код...
ибо вполне вероятно что в итоге такой операции мы получим переполнение в char a[50]

Автор: JAnty 29.3.2007, 15:20
Цитата(Partizan @  29.3.2007,  15:16 Найти цитируемый пост)
ибо вполне вероятно что в итоге такой операции мы получим переполнение в char a[50] 


А ведь правдо.  smile

Добавлено через 6 минут и 22 секунды
Проверил так:
Код

char a[2]="hh";
char b[80]="jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj";
char *c;
c=strcat(a,b);


printf выдал hhjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj

Ничо не переполнилось.  smile 

Автор: Goryachev 29.3.2007, 15:33
JAnty, в этом случае может нет side effects , но будет случай, в котором прога вылетит.

Автор: Dov 29.3.2007, 15:35
Цитата(JackYF @  29.3.2007,  14:02 Найти цитируемый пост)
А вообще не 50 и 80, а константы нужно указывать 

В данном случае, по-моему, вообще ничего не нужно  указывать, равно как и заморачиваться с динамическим массивом. Просто нужно объявить массив размером a + b и всё.
Так, например:
Код

char a[]="hhhhhhhhh";
char b[]="jjjjjjjj";
char с[sizeof(a) + sizeof(b)];
strcat(strcpy(c, a), b);
 
Ну, или что-то в этом роде.  smile 

Автор: Fazil6 29.3.2007, 17:01
Цитата(JAnty @  29.3.2007,  15:20 Найти цитируемый пост)
Ничо не переполнилось. 

 smile 
и на основании чего ты сделал такой вывод?

Автор: Dov 29.3.2007, 17:05
JAnty, уже здесь ты вышел за пределы массива, а твой компилятор об этом даже не догадался  smile 
Цитата(JAnty @  29.3.2007,  14:20 Найти цитируемый пост)
char a[2]="hh";


Автор: apook 29.3.2007, 17:13
Цитата

JAnty, уже здесь ты вышел за пределы массива, а твой компилятор об этом даже не догадался
Цитата

char a[2]="hh";
   

никто не вышел  smile 

Автор: Dov 29.3.2007, 17:20
Цитата(apook @  29.3.2007,  16:13 Найти цитируемый пост)
никто не вышел   


apook,  smile 

Автор: JAnty 29.3.2007, 17:22
Цитата(Dov @  29.3.2007,  17:05 Найти цитируемый пост)
JAnty, уже здесь ты вышел за пределы массива, а твой компилятор об этом даже не догадался   


Теоретически. Конец строки добавляется сам после массива.
В Билдере написал:
Код

 char a[2];
 a[0]='q';
 a[1]='w';
 a[2]='e';
 a[3]='r';
 Form1->Caption=a;

 smile 
Даже варнинга небыло. smile  (Непешите так проги.)

Автор: Partizan 29.3.2007, 17:30
JAnty, тебе просто повезло)

Автор: JAnty 29.3.2007, 17:40
10 раз откомпилил, 10 повезло. Вот она удача -> smile 

Автор: Partizan 29.3.2007, 17:44
тебе повезло что программа не вылетела с access violation при попытке записи за границы массива....

Автор: Kuvaldis 29.3.2007, 17:45
JAnty, 
Запусти прогу не из IDE, а из проводника. Думаю, что теперь увидишь разницу (скорее всего, ты еще и debug версию компилишь)

Автор: apook 29.3.2007, 17:45
Код

char a[2]="hh";

a[2]='\0'; все правильно  smile


Dov я не хулиганю эта обьявление правильное на мой взгляд
Код

char a[2]="\0";

чему равна длина этого массива? Только не надо говорить про плохие компиляторы



Автор: JackYF 29.3.2007, 17:54
Цитата(apook @  29.3.2007,  17:45 Найти цитируемый пост)
a[2]='\0'; все правильно  smile


выход за границы массива. ты имеешь доступ к a[0] и a[1]. У тебя размер - 2 элемента, а не 3.

Автор: JAnty 29.3.2007, 18:03
char a[2];
 a[0]='a';
 a[1]='q';
 a[2]='w';
 a[3]='e';
 a[4]='t';
 Forma->Caption=a;

Цитата(Kuvaldis @  29.3.2007,  17:45 Найти цитируемый пост)
Запусти прогу не из IDE, а из проводника. Думаю, что теперь увидишь разницу (скорее всего, ты еще и debug версию компилишь) 


Пожилание учол, откомпилил финальную в ехе и запустил на другом компе, и всё mrOk;  smile 

Автор: Partizan 29.3.2007, 18:09
ггг ) попробуй текст в 10 Мбайт дозаписать) может тогда наконец вылетит)

Автор: vinter 29.3.2007, 18:14
Цитата(JAnty @  29.3.2007,  18:03 Найти цитируемый пост)
Пожилание учол, откомпилил финальную в ехе и запустил на другом компе, и всё mrOk; 

везение и больше ничего, даже скорее невезение, потомучто когданить из-за этого на такую проблему можешь попасть..
почитай про устройство памяти и про определение переменных и про то как все это хранится, и nujulf поймешь в чем ты неправ

Цитата(apook @  29.3.2007,  17:45 Найти цитируемый пост)
чему равна длина этого массива? Только не надо говорить про плохие компиляторы

так тут как раз два элемента будет \0 и \0. \ - экранирующий символ 
Цитата(apook @  29.3.2007,  17:45 Найти цитируемый пост)
a[2]='\0'; все правильно  

что правильно, то что ты обьявил массив из 2 элементов, а обращаешься к третьему?

Автор: JAnty 29.3.2007, 18:22
Цитата(vinter @  29.3.2007,  18:14 Найти цитируемый пост)
везение и больше ничего, даже скорее невезение, потомучто когданить из-за этого на такую проблему можешь попасть..


Я же не собираюсь так и понатуре делать, память просто терпит, винда допускает оплошности, но суть бредовая, согласен.
По сути дело оно как, в памяти пишутся символы по порядку и потом \0 . потом читаем до \0, в указателе мы же не указываем длинну, а a[2]='\0' запишет символ \0 после символа a[1] в памяти.
 smile ИМХО

Автор: vinter 29.3.2007, 18:28
Цитата
По сути дело оно как, в памяти пишутся символы по порядку и потом \0 . потом читаем до \0, в указателе мы же не указываем длинну, а a[2]='\0' запишет символ \0 после символа a[1] в памяти.


но так не должно позволять делать!
хм.. у меня подозрение что здесь замешан борланд..

Добавлено через 2 минуты и 16 секунд
 smile респект 2003 студии, она не дала такое скомпилить smile 

Автор: apook 29.3.2007, 18:38
Цитата

но так не должно позволять делать!

char str[ 2 ]="\0";
что здесь опасного просто строка длинной 0, зачем экранирование
экранируется '\n'


Цитата

ты обьявил массив из 2 элементов, а обращаешься к третьему?

но он же там будет но кстати плохо однако он затереться может
(а может и нет smile чет я не уверен)


Автор: JAnty 29.3.2007, 18:45
Цитата(vinter @  29.3.2007,  18:28 Найти цитируемый пост)
респект 2003 студии, она не дала такое скомпилить   

Там так называемая "защита от дурака"
Именно так делается изменение массивов и т.д. в стандартных библиотеках.
А теперь это доступно пользователю в ручную. 
Превратим a[2] в a[3];
Код

char a[2];
a[2]=' ';    // стёрли \0 и записали ' '
a[3]='\0';    // тем самым добавили 1 символ; 

С этим надо быть осторожным. А лучше преобразовывать стандартными методами, которые делаются именно таким способом, но которые проверены годами и стандартом С.
ИМХО

Добавлено через 5 минут и 35 секунд
Шалости с ОЗУ. smile 

Автор: vinter 29.3.2007, 18:53
Цитата(JAnty @  29.3.2007,  18:45 Найти цитируемый пост)
Шалости с ОЗУ. 

а если сразу после массива идет нужная информация?? например другая строка, к чему тогда такие шалости могут привести?
Цитата(JAnty @  29.3.2007,  18:45 Найти цитируемый пост)
А лучше преобразовывать стандартными методами

это какими это? лучше динамически выделять, и не иметь проблем с памятью..

Автор: JAnty 29.3.2007, 18:59
Цитата(vinter @  29.3.2007,  18:53 Найти цитируемый пост)
а если сразу после массива идет нужная информация?? например другая строка, к чему тогда такие шалости могут привести?


Тогда разумеется это чревато полным пипецом. smile

Добавлено через 7 минут и 59 секунд
Цитата(vinter @  29.3.2007,  18:53 Найти цитируемый пост)
а если сразу после массива идет нужная информация?? например другая строка, к чему тогда такие шалости могут привести?


А тогда кагже работает указатель на строку, адрес не меняется, но строка растёт? а?

Автор: apook 29.3.2007, 19:15
Код

char str[ 50 ]=" World!", *s;

str[ 45 ]='H';
str[ 46 ]='e';
str[ 47 ]='l';
str[ 48 ]='l';
str[ 49 ]='o';

s=&str[ 45 ];
// указатель на строку str
cout << s[ 0 ];
cout << s[ 1 ];
cout << s[ 2 ];
cout << s[ 3 ];
cout << s[ 4 ];


cout << s[ -45 ]; 
cout << s[ -44 ];
cout << s[ -43 ];
cout << s[ -42 ];
cout << s[ -41 ];
cout << s[ -40 ];
cout << s[ -39 ];

Автор: vinter 29.3.2007, 19:20
Цитата(JAnty @  29.3.2007,  18:59 Найти цитируемый пост)
А тогда кагже работает указатель на строку, адрес не меняется, но строка растёт? а?

указатель это всего лишь адрес, а ф-ии вывода выводят все начиная с того на что указывает указатель, до '\0'
apook , это ты к чему??

Автор: JAnty 29.3.2007, 19:36
Цитата(vinter @  29.3.2007,  19:20 Найти цитируемый пост)
указатель это всего лишь адрес, а ф-ии вывода выводят все начиная с того на что указывает указатель, до '\0'


Адрес не маняется. Допустим у нас в строке 5 символов (5 ячеек в памяти + \0) а с 7 ячейки другая инфа, а мы взять, да изменили нашу строку до 35 символов, как оно сработает?

Автор: apook 29.3.2007, 19:36
Цитата

apook , это ты к чему??

Что-то навеяло, к вопросу о нуль символах и тем что за ним
а вообще это способ использовать память которая зря пустует 

Цитата

да изменили нашу строку до 35 символов, как оно сработает?

и как-же ты собрался менять размер статического массива?
с динамическим то это не так просто

Автор: vinter 29.3.2007, 19:39
Цитата(JAnty @  29.3.2007,  19:36 Найти цитируемый пост)
как оно сработает?

неопределено
Цитата(apook @  29.3.2007,  19:36 Найти цитируемый пост)
а вообще это способ использовать память которая зря пустует 

не надо так, зря ниче не пустует, а вот гемморой всегда на стремеsmile

Автор: apook 29.3.2007, 19:45
Цитата

не надо так, зря ниче не пустует, а вот гемморой всегда на стреме

Все отлично память пустует зря ведь она отведена под массив
из 50 символов тогда как занято 9 остальная allocate, да и гемороя
не так много разве что маленько  smile 

Автор: Partizan 29.3.2007, 19:48
=) ну вот забил ты в большом проекте эту "пустующую память" важными данными...
и через какоето время благополучно забыл об этом)
и думаешь...хммм...а чего она пустует...дайка я туда запишу чонить)

и пожалуйста) вот он и геморрой))) геморройчик)

Автор: JAnty 29.3.2007, 20:03
Цитата(apook @  29.3.2007,  19:36 Найти цитируемый пост)
и как-же ты собрался менять размер статического массива?
с динамическим то это не так просто

Так значит можно.

А я собрался менять *стр /*не массив*/, она же увеличивается не смотря на то, чо там дальше в памяти.

Автор: apook 29.3.2007, 20:05
Partizan 
Ну вот выделил ты динамическую память через new
забил ее важными данными забыл об этом и удалил через delete

только не спрашивай зачем забывать

Автор: Partizan 29.3.2007, 20:14
apook, причём тут динамическая память) речь ведь шла о предложенном тобой методе использования "простаивающей" памяти)

Автор: zkv 30.3.2007, 18:27
apook, JAnty, на практике, самое ценное в проге, это даные пользователя, а уж потом экономия оперативки и прочее. 
С вашим подходом вы можете не только программу уронить, но и (что в большинстве случаев хуже) эти данные подпортить, и неизвестно, когда это всплывет, и как весело потом будет искать ошибку  smile 
Можно представить, как в какой нибудь проге расчета зарплаты, "случайно" изменится повышающий коэффициент в меньшую сторону, пожалуй это будет справедливо, только если зарплата в этот момент будет рассчитываться для создателя этой программы  smile  

Вот вам примерчик использования "пустующей памяти":
Код

#include <iostream>

struct TESTMEMORY
{
    char str[31];
    char c;
};

int main()
{
    TESTMEMORY tm;
    tm.c = '!';
    tm.str[31] = '?';
    std::cout<<"\ntm.c = "<<tm.c<<"\n";
    std::cin.get();
}  

Цитата(vinter @  29.3.2007,  18:28 Найти цитируемый пост)
респект 2003 студии, она не дала такое скомпилить

хм... мой пример компилится безо всяких замечаний.

Автор: apook 30.3.2007, 18:44
Цитата

С вашим подходом

Что за такой не хороший подход, я ведь не настаиваю что это
есть способ которым желательно пользоваться, это вообще не
способ я просто к слову сказал просто показать что такое возможно
точнее если я уверен что элеметы массива существуют то обращаться
к ним необычно на первый взгляд наример str[ -20 ] как я показал
в примере разумеется в ответствеенных участках прогр лучше
пользоваться стандартными методами

ну разве-что иногда...  smile 

Автор: vinter 30.3.2007, 18:56
Цитата(zkv @  30.3.2007,  18:27 Найти цитируемый пост)
хм... мой пример компилится безо всяких замечаний.

действительно...странно, а в том примере, у меня писало overflow

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)