strcat - соединить соединить с char. как?
От: m.victor  
Дата: 27.01.08 12:08
Оценка:
Требуется к строке прибавить символ, как это лучше сделать?
strcat(s, c); — не работает c символом. Может какое-нибудь преобразование типов сделать или что-то.
Подскажите, пожалуйста!
Заранее очень благодарен!

31.01.08 18:51: Перенесено модератором из 'Алгоритмы' — Кодт
Re: strcat - соединить соединить с char. как?
От: deniok Россия  
Дата: 27.01.08 12:36
Оценка:
Здравствуйте, m.victor, Вы писали:

MV>Требуется к строке прибавить символ, как это лучше сделать?

MV>strcat(s, c); — не работает c символом. Может какое-нибудь преобразование типов сделать или что-то.
MV>Подскажите, пожалуйста!
MV>Заранее очень благодарен!

Если язык C — то выделяешь памяти на единицу больше, чем было нужно для исходной строки, и копируешь туда исходную строку и символ на дополнительное место.
Re: strcat - соединить соединить с char. как?
От: Socrat Россия  
Дата: 28.01.08 06:45
Оценка:
Здравствуйте, m.victor, Вы писали:

MV>Требуется к строке прибавить символ, как это лучше сделать?

MV>strcat(s, c); — не работает c символом. Может какое-нибудь преобразование типов сделать или что-то.
MV>Подскажите, пожалуйста!
MV>Заранее очень благодарен!

int len=strlen(s);
s[len]=c;
s[len+1]=0;
Re[2]: strcat - соединить соединить с char. как?
От: alex_mah Россия www.elsy.ru
Дата: 28.01.08 08:46
Оценка:
Здравствуйте, Socrat, Вы писали:

S>
S>int len=strlen(s);
S>s[len]=c;
S>s[len+1]=0;
S>


Ага. А потом всякие Акцесс Виолейшены и Сегментейшн Фолты после такого бывают. Нужно еще и массив увеличить.

Топикстартеру:
//исходные данные
char s[20];
char c = 0x34; // c - твой символ
//добавляем символ
int len=strlen(s);
char *newS = new char[len+1];
strcpy(newS,s);
newS[len]=c;
newS[len+1]=0;
//что-то делаем
...
//что бы память не текла
delete [] newS;

либо
//исходные данные
char s[20];
char c = 0x34; // c - твой символ
//добавляем символ
char tmp[2]={0,0};
tmp[1] = c; 
strcat(s,tmp);

можно еще по всякому. Это первое, что в голову пришло.
Re[3]: strcat - соединить соединить с char. как?
От: Socrat Россия  
Дата: 28.01.08 09:19
Оценка:
Здравствуйте, alex_mah, Вы писали:

_>Ага. А потом всякие Акцесс Виолейшены и Сегментейшн Фолты после такого бывают. Нужно еще и массив увеличить.


Я вообще-то считал, что раз используется strcat(s, c), то массив s достаточного размера, впрочем, как и у тебя во втором случае.

PS: а вот в первом случае у тебя точно эксепшн выскочит...
Re[4]: strcat - соединить соединить с char. как?
От: alex_mah Россия www.elsy.ru
Дата: 28.01.08 09:55
Оценка:
Здравствуйте, Socrat, Вы писали:

S>Я вообще-то считал, что раз используется strcat(s, c), то массив s достаточного размера, впрочем, как и у тебя во втором случае.


S>PS: а вот в первом случае у тебя точно эксепшн выскочит...


strcat сам длиной строки управляет
Help>strcat appends a copy of src to the end of dest. The length of the resulting string is strlen(dest) + strlen(src)
А в первом случае каюсь, был не прав и все такое.
Исправляемся
//исходные данные
char s[20];
char c = 0x34; // c - твой символ
//добавляем символ
int len=strlen(s);
char *newS = new char[len+1];
strcpy(newS,s);
newS[len-1]=c;
newS[len]=0;
//что-то делаем
...
//что бы память не текла
delete [] newS;

либо
//исходные данные
char s[20];
char c = 0x34; // c - твой символ
//добавляем символ
char tmp[2]={0,0};
tmp[0] = c; 
strcat(s,tmp);
Re[5]: strcat - соединить соединить с char. как?
От: Socrat Россия  
Дата: 28.01.08 10:07
Оценка:
Здравствуйте, alex_mah, Вы писали:

_>Здравствуйте, Socrat, Вы писали:


S>>Я вообще-то считал, что раз используется strcat(s, c), то массив s достаточного размера, впрочем, как и у тебя во втором случае.


S>>PS: а вот в первом случае у тебя точно эксепшн выскочит...


_>strcat сам длиной строки управляет

Help>>strcat appends a copy of src to the end of dest. The length of the resulting string is strlen(dest) + strlen(src)

Но не проверяет. Для безопасного добавления используется strncat.

_>А в первом случае каюсь, был не прав и все такое.

_>Исправляемся

_>
_>//исходные данные
_>char s[20];
_>char c = 0x34; // c - твой символ
_>//добавляем символ
_>int len=strlen(s);
_>char *newS = new char[len+1];
_>strcpy(newS,s);
_>newS[len-1]=c;
_>newS[len]=0;
_>//что-то делаем
_>...
_>//что бы память не текла
_>delete [] newS;
_>


И опять неправильно. Символ c затрет последний символ строки.

Кстати, а где инициализация строки? Если там будет мусор, то неизвестно, что произойдет...
Re[6]: strcat - соединить соединить с char. как?
От: alex_mah Россия www.elsy.ru
Дата: 28.01.08 12:22
Оценка:
Здравствуйте, Socrat, Вы писали:

S>Кстати, а где инициализация строки? Если там будет мусор, то неизвестно, что произойдет...


Ну инициализация — не наше дело. Считаем, что строка проинициализирована. Хотя, если так будет легче...

S>И опять неправильно. Символ c затрет последний символ строки.

Это еще почему?

//исходные данные
char s[20]={'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',0};
char c = 0x34; // c - твой символ
//добавляем символ
int len=strlen(s);
//Имеем строку длиной 20 символов. len = 20 т.е
char *newS = new char[len+1];
//Создаем новую строку длиной 21 символ.
strcpy(newS,s);
//копируем данные из первой строки. Полезных данных - 19 байт. Не забываем про нулевой символ.
newS[len-1]=c;
//изменяем элемент с номером 19 в новой строке (т.е. 20-й, предпоследний)
newS[len]=0;
//в элемент с номером 20  (т.е. 21-й, последний) в новой строке записываем 0, конец строки
//что-то делаем
...
//что бы память не текла
delete [] newS;


Что не так?
Re[7]: strcat - соединить соединить с char. как?
От: Socrat Россия  
Дата: 28.01.08 13:07
Оценка:
Здравствуйте, alex_mah, Вы писали:

S>>И опять неправильно. Символ c затрет последний символ строки.

_>Это еще почему?

_>
_>//исходные данные
_>char s[20]={'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',0};
_>char c = 0x34; // c - твой символ
_>//добавляем символ
_>int len=strlen(s);
_>//Имеем строку длиной 20 символов. len = 20 т.е
_>char *newS = new char[len+1];
_>//Создаем новую строку длиной 21 символ.
_>strcpy(newS,s);
_>//копируем данные из первой строки. Полезных данных - 19 байт. Не забываем про нулевой символ.
_>newS[len-1]=c;
_>//изменяем элемент с номером 19 в новой строке (т.е. 20-й, предпоследний)
_>newS[len]=0;
_>//в элемент с номером 20  (т.е. 21-й, последний) в новой строке записываем 0, конец строки
_>//что-то делаем
_>...
_>//что бы память не текла
_>delete [] newS;
_>


_>Что не так?


Если опустить выделение памяти и копирование, то

char s[20]="01234";
int len=strlen(s); // len=5
s[4]='!';          // s="0123!"
Re[8]: strcat - соединить соединить с char. как?
От: alex_mah Россия www.elsy.ru
Дата: 28.01.08 13:21
Оценка:
Здравствуйте, Socrat, Вы писали:

S>Если опустить выделение памяти и копирование, то


S>
S>char s[20]="01234";
S>int len=strlen(s); // len=5
S>s[4]='!';          // s="0123!"
S>


и чего? Вопрос был как прибавить символ, а не изменить последний.
Re[9]: strcat - соединить соединить с char. как?
От: Socrat Россия  
Дата: 28.01.08 14:02
Оценка:
Здравствуйте, alex_mah, Вы писали:

_>и чего? Вопрос был как прибавить символ, а не изменить последний.


Правильно. А теперь посмотри еще раз внимательно на свой вариант:

//исходные данные
char s[20];
char c = 0x34; // c - твой символ
//добавляем символ
int len=strlen(s);
char *newS = new char[len+1];
strcpy(newS,s);
newS[len-1]=c;
newS[len]=0;
//что-то делаем
...
//что бы память не текла
delete [] newS;
Re[10]: strcat - соединить соединить с char. как?
От: alex_mah Россия www.elsy.ru
Дата: 29.01.08 05:54
Оценка:
newS[len]=c;
newS[len+1]=0;

Запутал ты меня совсем.
Re[11]: strcat - соединить соединить с char. как?
От: Socrat Россия  
Дата: 29.01.08 07:07
Оценка:
Здравствуйте, alex_mah, Вы писали:

_>
_>newS[len]=c;
_>newS[len+1]=0;
_>

_>Запутал ты меня совсем.

Молодец. А теперь посмотри, сколько памяти ты выделяешь.
Re[3]: strcat - соединить соединить с char. как?
От: Кодт Россия  
Дата: 31.01.08 16:10
Оценка:
Здравствуйте, alex_mah, Вы писали:

_>Ага. А потом всякие Акцесс Виолейшены и Сегментейшн Фолты после такого бывают. Нужно еще и массив увеличить.


Не надо валить в кучу управление памятью и работу с массивом символов. Это две ортогональные задачи.
При том, что управлять памятью можно по-разному.
— malloc/free
— realloc
— new[]/delete[]
а если использовать STL, то на векторах и тем более строках это вообще тривиально
vector<char> s; // допустим, что содержимое - это честная SZ

s.insert(s.end()-1, c);
// или, что там на самом деле происходит
size_t n = s.size();
s.resize(n+1);
s[n-1] = c; s[n] = 0;


Но изначальный-то вопрос вообще был не про память.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: strcat - соединить соединить с char. как?
От: L.Jenya  
Дата: 01.02.08 01:11
Оценка: -1
Здравствуйте, m.victor, Вы писали:

MV>Требуется к строке прибавить символ, как это лучше сделать?

MV>strcat(s, c); — не работает c символом. Может какое-нибудь преобразование типов сделать или что-то.
MV>Подскажите, пожалуйста!
MV>Заранее очень благодарен!


strcat(s,c[0]);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.