Требуется к строке прибавить символ, как это лучше сделать?
strcat(s, c); — не работает c символом. Может какое-нибудь преобразование типов сделать или что-то.
Подскажите, пожалуйста!
Заранее очень благодарен!
31.01.08 18:51: Перенесено модератором из 'Алгоритмы' — Кодт
Здравствуйте, m.victor, Вы писали:
MV>Требуется к строке прибавить символ, как это лучше сделать? MV>strcat(s, c); — не работает c символом. Может какое-нибудь преобразование типов сделать или что-то. MV>Подскажите, пожалуйста! MV>Заранее очень благодарен!
Если язык C — то выделяешь памяти на единицу больше, чем было нужно для исходной строки, и копируешь туда исходную строку и символ на дополнительное место.
Здравствуйте, m.victor, Вы писали:
MV>Требуется к строке прибавить символ, как это лучше сделать? MV>strcat(s, c); — не работает c символом. Может какое-нибудь преобразование типов сделать или что-то. MV>Подскажите, пожалуйста! MV>Заранее очень благодарен!
Ага. А потом всякие Акцесс Виолейшены и Сегментейшн Фолты после такого бывают. Нужно еще и массив увеличить.
Топикстартеру:
//исходные данные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);
можно еще по всякому. Это первое, что в голову пришло.
Здравствуйте, 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);
Здравствуйте, 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 затрет последний символ строки.
Кстати, а где инициализация строки? Если там будет мусор, то неизвестно, что произойдет...
Здравствуйте, 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;
Здравствуйте, 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!"
Здравствуйте, 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;
Здравствуйте, 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;
Но изначальный-то вопрос вообще был не про память.
Здравствуйте, m.victor, Вы писали:
MV>Требуется к строке прибавить символ, как это лучше сделать? MV>strcat(s, c); — не работает c символом. Может какое-нибудь преобразование типов сделать или что-то. MV>Подскажите, пожалуйста! MV>Заранее очень благодарен!