Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > трабла с ctrlen


Автор: pycha 18.7.2008, 13:43
драсте. Тут есть проблема : вот обьявил функцию , которая должна обьеденять две строки в одну. Одна передаваемая *сhar  а вторая масив из класа. Когда к strlen предаю строку *сhar
то почемуто возвращается неопределенное число. 
обьвил в класе так:
Код

friend String & operator + (const char * st, const String & st2);


вот сама функция:
Код

String & operator+(const char * st, const String &st2)
{
    String temp;
    int le = strlen(st);//        le    -858993460    int
    int le2 = strlen(st2.str);
    temp.len = le+le2;
    temp.str = new char[temp.len+1];
    strcpy(temp.str, st);
    le++;
    for (int i = 0, le ; le < temp.len; le++, i++)
        temp.str[le]=st2.str[i];
    temp.str[le]='\0';
    return temp;
}


функцию вызываю так:
Код

s2 = "My name is " + s3;


что тут не так?

Автор: JackYF 18.7.2008, 14:21
pycha,

1) ты не имеешь права возвращать ссылку на временных объект, эта функция должна возвращать "String"

2) 
Цитата(pycha @  18.7.2008,  12:43 Найти цитируемый пост)
 int le = strlen(st);//        le    -858993460    int

в отладчике смотрел? до или после выполнения оператора? в любом случае исправь 1), перекомпилируй и проверь, работает ли теперь

Автор: pycha 18.7.2008, 15:43
Просмотрел еще раз и увидел что неправильно понял ошибку. le значение присваивает правильно(я банально поспотрел значение le до присваивания значения) Это потом в самом цикле ей почемуто опять присваивается такое значение.Исправил (теперь возвращает String а не ссылку). Кстати как использую потом le в цикле выдает  предупреждение

g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\задача 12ю2\задача 12ю2\12.4a.cpp(101) : warning C4700: uninitialized local variable 'le' used


да смотрел под отладчиком


Автор: bsa 18.7.2008, 16:05
очень рекомендую почитать умные книжки по С++. В частности Мейерса и Александреску.
А для начала посмотри, как устроен стандартный класс http://www.sgi.com/tech/stl/basic_string.html

Автор: pycha 18.7.2008, 16:09
отредактировал предыдущее сообщение

используя метод проб и ошибок понял что тут for (int i = 0, le... le использовать не надо было. Но возникла другая проблема
temp.str[le]=st2.str[i]
почемуто не обьеденяет строки(почемуто не копирует символы)

Автор: JackYF 18.7.2008, 17:50
Цитата(pycha @  18.7.2008,  15:09 Найти цитируемый пост)
почемуто не обьеденяет строки(почемуто не копирует символы)

Потому что это присваивание символов, не больше и не меньше. То, что ты хочешь, делает strcpy, если я правильно понял. Всё же проштудировать справочникам по функциям языка Си не помешает.

Автор: pycha 18.7.2008, 18:02
Мне нужна не замена а обьединение. Вот например:
s2 = "My name is " + s3;
В класе s3 находится имя (например "pycha") и в результате  действий "My name is " + s3 в классe s2 теперь будет строка "My name is pycha".- вот что мне надо smile  

Автор: bsa 18.7.2008, 19:00
pycha, тебе нужна функция strcat

Автор: Rififi 18.7.2008, 19:40
Цитата(pycha @  18.7.2008,  19:02 Найти цитируемый пост)
В класе s3 находится имя (например "pycha") и в результате  действий "My name is " + s3 в классe s2 теперь будет строка "My name is pycha".- вот что мне надо smile  

в общем случае действовать надо так:

1. узнать результирующее количество символов (не забывая про завершающий нуль-терминатор)
size_t len = strl1n(s1) + strlen(s2) + 1;

2. выделить память под объединённую строку
char* s = new char[len];

3. слить строки в одну
strcpy(s, s1)
strcat(s, s2);

4. удалить старую строку в классе и заменить на новую
delete [] m_str[];
m_str = s;

5. вернуть объект (предполагается, что имеется соответствующий конструктор)
return *this;

Автор: varnie 18.7.2008, 20:56
pycha
а вообще, зачем спускаться на Си-уровень работы с строками, если есть std::string, спасающий программиста от кучи проблем? 
Rififi
Цитата(Rififi @  18.7.2008,  22:40 Найти цитируемый пост)
4. удалить старую строку в классе и заменить на новую
delete [] m_str[];

может быть 
Код

delete [] m_str;
?

Автор: Rififi 18.7.2008, 21:41
Цитата(varnie @  18.7.2008,  21:56 Найти цитируемый пост)
может быть 
Код
delete [] m_str;

?

совершенно верно, thanx за поправку, проглючило (:

Автор: pycha 19.7.2008, 02:36
Да действительно оно! Я учу с ноля С++ только полтора месяца самостоятельно поэтому я еще о многом не знаю

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