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


Автор: _hunter 7.1.2004, 01:36
как из функции получить строку , если вызов не прямой?
т.е. делаю так:

char *a = new char[10];
func(a);


func(char * b&){
c = b;
c = "d";
//хотелось бы изменив c изменить a
//т.е. получить a == "d";
}

Заранее благодарю за ответ.

Автор: <Spawn> 7.1.2004, 08:00
Если я тебя правильно понял, то так:

Код
void func(char *b)
{
       char *c;
       c = b;
       *c = 'd';
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
       char *a = new char[10];
       func(a);
}

Автор: bel_nikita 7.1.2004, 10:27
char *a = new char[10];
f(char *&b)
{
...
}

Автор: setq 7.1.2004, 12:18
код в 1м сообщении очень похож на си++... но чего-то не хватает

Автор: _hunter 7.1.2004, 13:18
to setq классов там не хватает smile.gif

Автор: mr.DUDA 7.1.2004, 22:15
to <Spawn>
Цитата
void func(char *b)
{
       char *c;
       c = b;
       *c = 'd';
}

вернет строку (или массив символов), которая существует только в теле функции и, по идее, нигде более (т.е. вне функции указатель на 'd' потеряет валидность, т.к. строка как и все локальные переменные и непосредственные данные, размещена в стеке). Тут правильнее делать strcpy(c, "d");

Автор: Hroft 8.1.2004, 13:45
Нет, ну я не знаю конечно, но ведь вполне нормально работает...
Код

#include <iostream>

void func(char *b)
{
char *c;
c = b;
*c = 'd';
}

int main(int argc, char* argv[])
{
char c[] = "222";
func(c);
std::cout<<c;
return 0;
}

В func изменяется сама строка - обращение-то по адресу. Или я неправ?

Автор: DENNN 8.1.2004, 14:49
Цитата
В func изменяется сама строка - обращение-то по адресу. Или я неправ?

Прав. И в функции изменяется текст непосредственно по переданному адресу, т.е. при выходе из функции будет уничтожена переменная c, но не данные по преданному адресу.

Автор: mr.DUDA 8.1.2004, 21:29
Цитата
В func изменяется сама строка - обращение-то по адресу. Или я неправ?

Не прав. В данном случае выражение *c = 'd' изменяет не строку, а символ в строке по адресу *c (1 байт); вопрос же стоял, как передать строку из функции -- если например присвоить c = "dddd";, то при выходе из функции строковый литерал будет уничтожен, и переменная c потеряет валидность.

Автор: <Spawn> 9.1.2004, 04:58
mr.DUDA Но ведь c указывает туда, куда и b(c = b), а b в свою очередь указатель на переданую в функцию a. Т.е. должны изменяться байтики a. Или я не до конца что то понял?

Автор: RAN 9.1.2004, 07:54
<Spawn>, да всё ты правильно понимаешь. mr.DUDA имеет ввиду, что задача была другой. Просто автор темы пока не силён в языке и его не поняли. Надо поменять строку полностью, а не первый символ. Мой совет использовать контейнер какой-нибудь.
Код
std::string str = "строка";
change_string( str );
...................................
void change_string(const std::string& param)
{
   param = "new string";
}


Другой способ, самому делать то, что делает контейнер. Освобождать память от старой строки, выделять для новой, проверять на недостаток памяти, если надо, и т.п.
Код
void change_string(char* param)
{
   delete param;
   
   const char str[] = "new string";
   param = NULL;
   param = new char[ sizeof(str) ];
   if(param == NULL) //Не выделилась память
       throw .... какое-то исключение ....
   strcpy(param, str);
}


Автор: _hunter 9.1.2004, 11:32
всем спасибо за участие smile.gif
сделал по методу <Spawn>
void func(char *b)
{
char *c;
c = b;
*c = 'd';
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
char *a = new char[10];
func(a);
}
вместо *c = 'd' использовал цикл и все ОК

Автор: maxim1000 9.1.2004, 12:23
Цитата
Код
void func(char *b)
{
char *c;
c = b;
*c = 'd';
}

интересная конструкция smile.gif
Код
void func(char *b)
{
 *b = 'd';
}

Автор: _hunter 9.1.2004, 12:59
to maxim1000
почитай первый пост smile.gif там все написанно

Автор: RAN 10.1.2004, 01:00
Цитата
to maxim1000
почитай первый пост  там все написанно

_hunter верно указал. Вы немного запутались. Переменная с в твоём коде не нужна.
Твоя функция заменяет первый символ в строке и всё. Причём если ей передать "", то результат не предсказуем. Нулевой байт будет заменён символом 'b'.

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