Здравствуйте g0g1, Вы писали:
G>Проблема такова....
G>Нужно, что бы функция возвратила строку... G>Пробовал вот так..
G>char stripstr() G>{ G> char *pam; G> strcpy(pam, "Some string"); G> return *pam; G>} G>[/code]
G>Функция возвращает только первый символ...
во-первых твоя функция возвращает char — один символ
а нужно то целую строку возвращать (массив символов —
так называемая в народе С-строка)
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте orangy, Вы писали:
O>Это что ж это вы пишите?
O>
O> char *pam = new char[256];
O>
случайность — что тут ещо скажеш в свое оправдание?
Re: Возвращение строки в С\С++
От:
Аноним
Дата:
01.11.02 15:20
Оценка:
char *p;
strcpy(p,"Some string");
Так нельзя. В p — неопределенное значение. Указывает на никуда И в это никуда ты что-то пытаешься писать. То, что у тебя хоть что-то сработало — случайность. Да и возвращаешь ты char — т.е. один символ.
Re[2]: Возвращение строки в С\С++
От:
Аноним
Дата:
01.11.02 15:24
Оценка:
P>во-вторых — указатель *pam нельзя просто так возвращать из функции P>он же объявлен как локальний — нужно выделить например под него память P>юзая new
Указатель, независимо от того локальный он или нет, вернуть можно (ты ж не ссылку на него вернул). Проблема в том, что его нельзя так использовать (в стрцпи) без инициализации — выделения памяти.
G>Функция возвращает только первый символ...
G>Может подскажет кто советом?
В этом коде 2 ошибки и 1 опасный момент:
Ошибки:
1)Функция по опредеделению возвр. char
2)char *pam;
strcpy(pam,"Some string");\\удар по памяти
опасный момент:
Если предположить что память всё таки выделялась:
char *pam = new char[16];
strcpy(pam, "Some string");
return *pam;
нежелательно выделять её внутри ф-ции и возвращать указатель,
т.к. неясно как она освободится (если конечно функция
не для этого предназначена)
Это вообще очень плохо. У auto_ptr<> совершенно непрозрачная семантика, и непонятно, зачем оно здесь вообще нужно, почему нельзя напрямую вернуть string?
А>Это вообще очень плохо. У auto_ptr<> совершенно непрозрачная семантика, и непонятно, зачем оно здесь вообще нужно, почему нельзя напрямую вернуть string?
Можно подробнее о "непрозрачнойя семантике"? А то мужики то не знаю!
Re[4]: Возвращение строки в С\С++
От:
Аноним
Дата:
06.11.02 09:10
Оценка:
Здравствуйте Анатолий Широков, Вы писали:
АШ>Можно подробнее о "непрозрачнойя семантике"? А то мужики то не знаю!
void f()
{
std::auto_ptr< std::string >ps1(new std::string);
// Угадай, что здесь означает *ps1?
std::auto_ptr< std::string >ps2(ps1);
// А здесь?
}
Вообще, передача владения для таких "оберток" — сплошная муть!
В приведенном выше примере формально все хорошо, но чревато ошибками на вызывающей стороне...
Ну если не правильно использовать, то конечно все будет "семантически непрозрачно". А>
А>void f()
А>{
А> std::auto_ptr< std::string >ps1(new std::string);
/*
Стандарт гласит, что операции разадресации требует: get() != 0
Значит по всем правилам, ты должет написать что вроде того:
if( ps1.get() != 0 )
{
// используй на здоровье
cout << (*ps1);
}
Так что все, вроде, специфицировано.
*/
А> // Угадай, что здесь означает *ps1? - разадресанию указателя (*get())
А> std::auto_ptr< std::string >ps2(ps1)
А> // А здесь? - раздресанию указателя (*get())
А>}
А>
А>Вообще, передача владения для таких "оберток" — сплошная муть!
Почему же — дешево и сердито, ИМХО.
А>В приведенном выше примере формально все хорошо, но чревато ошибками на вызывающей стороне...
Если плевать на контракт, то да — ошибки будут. Здесь orangy приводил пример:
ostream& operator << (ostream &stream, const SomeClass &)
{
// так вот что будет если возвратить не stream - а нечто другое?return ???;
}
Re[6]: Возвращение строки в С\С++
От:
Аноним
Дата:
06.11.02 09:50
Оценка:
Здравствуйте Анатолий Широков, Вы писали:
АШ>Если плевать на контракт, то да — ошибки будут.
Проблемы в том, что некоторые конструкции слишком чреваты...
Я читаю чты мозги не заморачивать всегда возвращай указатель на один из передаваемых аргументов в функцию и все. Так все операции со строками реализованны.
Что-то типа такого.
char * функция(
char * dst,
const char * src
)
{
char * cp = dst;
что-то делаем
return( dst ); /* return dst */
}