Возвращение строки в С\С++
От: g0g1  
Дата: 31.10.02 21:31
Оценка:
Проблема такова....

Нужно, что бы функция возвратила строку...
Пробовал вот так..


char stripstr();
/*....................*/

char stripstr()
{
    char *pam;
    strcpy(pam, "Some string");
    return *pam;
}


Функция возвращает только первый символ...

Может подскажет кто советом?
Re: Возвращение строки в С\С++
От: uuid N/A
Дата: 31.10.02 21:51
Оценка: 3 (1)
Здравствуйте g0g1, Вы писали:

G>Проблема такова....


G>Нужно, что бы функция возвратила строку...

G>Пробовал вот так..

G>

G>
G>char stripstr();
G>/*....................*/

G>char stripstr()
G>{
G>    char *pam;
G>    strcpy(pam, "Some string");
G>    return *pam;
G>}
G>


G>Функция возвращает только первый символ...


G>Может подскажет кто советом?


char * stripstr();
/*....................*/

char * stripstr()
{
    return _tcsdup(_T("Some string"));
}
//or
char * stripstr()
{
    char * pam = new char[MAX_STRING_LEN];
    _tcsncpy( pam, _T("Some string"), MAX_STRING_LEN );

    //to ensure integrity of string:
    pam[MAX_STRING_LEN-1] = _T('\0');
    return pam;
}
Математик должен быть ленивым. (c) мой бывший преподаватеть математики.
Re: Возвращение строки в С\С++
От: promko Украина  
Дата: 31.10.02 22:01
Оценка:
Здравствуйте g0g1, Вы писали:

G>Проблема такова....


G>Нужно, что бы функция возвратила строку...

G>Пробовал вот так..

G>char stripstr()

G>{
G> char *pam;
G> strcpy(pam, "Some string");
G> return *pam;
G>}
G>[/code]

G>Функция возвращает только первый символ...


во-первых твоя функция возвращает char — один символ
а нужно то целую строку возвращать (массив символов —
так называемая в народе С-строка)

char* stripstr()
{
char *pam = new char(256);
strcpy(pam, "Some string");
return pam;
}

во-вторых — указатель *pam нельзя просто так возвращать из функции
он же объявлен как локальний — нужно выделить например под него память
юзая new
Re: Возвращение строки в С\С++
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 31.10.02 22:04
Оценка:
Здравствуйте g0g1, Вы писали:

G>Проблема такова....


G>Нужно, что бы функция возвратила строку...

G>Пробовал вот так..

G>

G>
G>char stripstr();
G>/*....................*/

G>char stripstr()
G>{
G>    char *pam;
G>    strcpy(pam, "Some string"); 
G>    return *pam;
G>}
G>


G>Функция возвращает только первый символ...


Правильно, поскольку тип возвращаемого значения и указан как единственный символ (char).

В твоём случае можно сделать так (в стиле C):
void stripstr(char *buff)
{
  strcpy(buff, "Some string")
}


Т.е., скопировать строку в буфер, адрес которого передан извне.

Или — в стиле C++ с использованием STL:

1.
#include <string>
void stripstr(std::string *res)
{
  *res = "Some string";
}


2.
#include <string>
std::string stripstr(void)
{
  return "Some string";
}
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[2]: Возвращение строки в С\С++
От: orangy Россия
Дата: 31.10.02 22:45
Оценка:
Здравствуйте promko, Вы писали:

P>    char *pam = new char(256);

Это что ж это вы пишите?

   char *pam = new char[256];
RSDN@Home 1.0 alpha 12 (tester's build)
"Develop with pleasure!"
Re[3]: Возвращение строки в С\С++
От: promko Украина  
Дата: 01.11.02 15:12
Оценка:
Здравствуйте 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
Указатель, независимо от того локальный он или нет, вернуть можно (ты ж не ссылку на него вернул). Проблема в том, что его нельзя так использовать (в стрцпи) без инициализации — выделения памяти.
Re: Возвращение строки в С\С++
От: Юнусов Булат Россия  
Дата: 04.11.02 17:33
Оценка: 22 (3)
Здравствуйте g0g1, Вы писали:

std::auto_ptr<std::string> something()
{
    std::auto_ptr<std::string> s(new std::string);
    *s = "foobar";
    return s;
}


Тут написано почему так лучше
http://www.gotw.ca/publications/xc++-auto_ptr.htm
http://www.gotw.ca/publications/using_auto_ptr_effectively.htm
Re: Возвращение строки в С\С++
От: prl  
Дата: 04.11.02 23:40
Оценка:
Здравствуйте g0g1, Вы писали:

G>Проблема такова....


G>Нужно, что бы функция возвратила строку...

G>Пробовал вот так..

G>

G>
G>char stripstr();
G>/*....................*/

G>char stripstr()
G>{
G>    char *pam;
G>    strcpy(pam, "Some string");
G>    return *pam;
G>}
G>


G>Функция возвращает только первый символ...


G>Может подскажет кто советом?

В этом коде 2 ошибки и 1 опасный момент:
Ошибки:
1)Функция по опредеделению возвр. char
2)char *pam;
strcpy(pam,"Some string");\\удар по памяти
опасный момент:
Если предположить что память всё таки выделялась:
char *pam = new char[16];
strcpy(pam, "Some string");
return *pam;
нежелательно выделять её внутри ф-ции и возвращать указатель,
т.к. неясно как она освободится (если конечно функция
не для этого предназначена)
Re: Возвращение строки в С\С++
От: Alex Smirnov Россия  
Дата: 06.11.02 08:30
Оценка:
Здравствуйте g0g1, Вы писали:

G>Проблема такова....


G>Нужно, что бы функция возвратила строку...

G>Пробовал вот так..

G>

G>
G>char stripstr();
G>/*....................*/

G>char stripstr()
G>{
G>    char *pam;
G>    strcpy(pam, "Some string");
G>    return *pam;
G>}
G>


G>Функция возвращает только первый символ...


G>Может подскажет кто советом?


А мож и просто во как:
 char* GetStr() { return "Some string!"; }

Так как это возврат константной строки, указатель на неё будет жить и после возврата из функции.
Alex
Re[2]: Возвращение строки в С\С++
От: Анатолий Широков СССР  
Дата: 06.11.02 08:50
Оценка:
AS>А мож и просто во как:
AS>
AS> const char* GetStr() { return "Some string!"; }
AS>

Если не подправиmь тип возвращаемого значения — могут возникнуть неприятности:
    char *buf = GetStr();
    buf[1] = 'I'; // "...Того ли ты ждал?" (с) Аквариум
Re[2]: Возвращение строки в С\С++
От: Аноним  
Дата: 06.11.02 08:56
Оценка:
Здравствуйте Юнусов Булат, Вы писали:

ЮБ>Здравствуйте g0g1, Вы писали:


ЮБ>
ЮБ>std::auto_ptr<std::string> something()
ЮБ>{
ЮБ>    std::auto_ptr<std::string> s(new std::string);
ЮБ>    *s = "foobar";
ЮБ>    return s;
ЮБ>}
ЮБ>


Это вообще очень плохо. У auto_ptr<> совершенно непрозрачная семантика, и непонятно, зачем оно здесь вообще нужно, почему нельзя напрямую вернуть string?
Re[3]: Возвращение строки в С\С++
От: Анатолий Широков СССР  
Дата: 06.11.02 09:00
Оценка:
А>Это вообще очень плохо. У 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);
    // А здесь?
}


Вообще, передача владения для таких "оберток" — сплошная муть!

В приведенном выше примере формально все хорошо, но чревато ошибками на вызывающей стороне...
Re[3]: Возвращение строки в С\С++
От: Alex Smirnov Россия  
Дата: 06.11.02 09:15
Оценка:
Здравствуйте Анатолий Широков, Вы писали:

АШ>Если не подправиmь тип возвращаемого значения — могут возникнуть неприятности:

АШ>
АШ>    char *buf = GetStr();
АШ>    buf[1] = 'I'; // "...Того ли ты ждал?" (с) Аквариум
АШ>

Каюсь...забыл дописать...
Но можно ещё и вот так:
char*    GetStr1()
{
    static    char mass[256];
    strcpy( mass, "Some string1!");
    return mass;
}

Тогда код
buf[1] = 'I';
можно будет и делать
Правда я бы не стал для своих нужд писать таких функций!!!
Alex
Re[5]: Возвращение строки в С\С++
От: Анатолий Широков СССР  
Дата: 06.11.02 09:41
Оценка:
Ну если не правильно использовать, то конечно все будет "семантически непрозрачно".
А>
А>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
Оценка:
Здравствуйте Анатолий Широков, Вы писали:

АШ>Если плевать на контракт, то да — ошибки будут.


Проблемы в том, что некоторые конструкции слишком чреваты...
Re[4]: Возвращение строки в С\С++
От: Анатолий Широков СССР  
Дата: 06.11.02 09:53
Оценка:
AS>Но можно ещё и вот так:
AS>
AS>char*    GetStr1()
AS>{
AS>    static    char mass[256];
AS>    strcpy( mass, "Some string1!");
AS>    return mass;
AS>}
AS>


Тоже могут быть проблемы, но другого рода:
extern char* myupper(char *);
char *aPtr = myupper(GetStr1());
printf("%s %s", GetStr1(), aPtr);

Выведет не то что ожидалось:
Some string1! Some string1!
Re: Возвращение строки в С\С++
От: Whisperer  
Дата: 06.11.02 10:32
Оценка:
Здравствуйте g0g1, Вы писали:

Я читаю чты мозги не заморачивать всегда возвращай указатель на один из передаваемых аргументов в функцию и все. Так все операции со строками реализованны.
Что-то типа такого.
char * функция(
char * dst,
const char * src
)
{
char * cp = dst;
что-то делаем
return( dst ); /* return dst */
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.