Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> трабла с ctrlen, или же неправильная передача char 
V
    Опции темы
pycha
Дата 18.7.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: 1
Всего: 13



драсте. Тут есть проблема : вот обьявил функцию , которая должна обьеденять две строки в одну. Одна передаваемая *с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;


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

Это сообщение отредактировал(а) pycha - 18.7.2008, 13:48
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
JackYF
Дата 18.7.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



pycha,

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

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

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



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
pycha
Дата 18.7.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: 1
Всего: 13



Просмотрел еще раз и увидел что неправильно понял ошибку. 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


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



Это сообщение отредактировал(а) pycha - 18.7.2008, 16:30
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
bsa
Дата 18.7.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



очень рекомендую почитать умные книжки по С++. В частности Мейерса и Александреску.
А для начала посмотри, как устроен стандартный класс basic_string
PM   Вверх
pycha
Дата 18.7.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: 1
Всего: 13



отредактировал предыдущее сообщение

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


Это сообщение отредактировал(а) pycha - 18.7.2008, 17:03
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
JackYF
Дата 18.7.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



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

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
pycha
Дата 18.7.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: 1
Всего: 13



Мне нужна не замена а обьединение. Вот например:
s2 = "My name is " + s3;
В класе s3 находится имя (например "pycha") и в результате  действий "My name is " + s3 в классe s2 теперь будет строка "My name is pycha".- вот что мне надо smile  
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
bsa
Дата 18.7.2008, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



pycha, тебе нужна функция strcat
PM   Вверх
Rififi
Дата 18.7.2008, 19:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 3
Всего: 36



Цитата(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;


Это сообщение отредактировал(а) Rififi - 18.7.2008, 19:44
PM MAIL   Вверх
varnie
Дата 18.7.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.9.2007

Репутация: нет
Всего: 0



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

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

delete [] m_str;
?

PM MAIL   Вверх
Rififi
Дата 18.7.2008, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 3
Всего: 36



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

?

совершенно верно, thanx за поправку, проглючило (:
PM MAIL   Вверх
pycha
Дата 19.7.2008, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: 1
Всего: 13



Да действительно оно! Я учу с ноля С++ только полтора месяца самостоятельно поэтому я еще о многом не знаю
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1963 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.