Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 | ||
Если я тебя правильно понял, то так:
|
Автор: 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 классов там не хватает ![]() |
Автор: mr.DUDA 7.1.2004, 22:15 | ||
to <Spawn>
вернет строку (или массив символов), которая существует только в теле функции и, по идее, нигде более (т.е. вне функции указатель на 'd' потеряет валидность, т.к. строка как и все локальные переменные и непосредственные данные, размещена в стеке). Тут правильнее делать strcpy(c, "d"); |
Автор: Hroft 8.1.2004, 13:45 | ||
Нет, ну я не знаю конечно, но ведь вполне нормально работает...
В func изменяется сама строка - обращение-то по адресу. Или я неправ? |
Автор: DENNN 8.1.2004, 14:49 | ||
Прав. И в функции изменяется текст непосредственно по переданному адресу, т.е. при выходе из функции будет уничтожена переменная c, но не данные по преданному адресу. |
Автор: mr.DUDA 8.1.2004, 21:29 | ||
Не прав. В данном случае выражение *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 имеет ввиду, что задача была другой. Просто автор темы пока не силён в языке и его не поняли. Надо поменять строку полностью, а не первый символ. Мой совет использовать контейнер какой-нибудь.
Другой способ, самому делать то, что делает контейнер. Освобождать память от старой строки, выделять для новой, проверять на недостаток памяти, если надо, и т.п.
|
Автор: _hunter 9.1.2004, 11:32 |
всем спасибо за участие ![]() сделал по методу <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 | ||||||
интересная конструкция ![]()
|
Автор: _hunter 9.1.2004, 12:59 |
to maxim1000 почитай первый пост ![]() |
Автор: RAN 10.1.2004, 01:00 | ||
_hunter верно указал. Вы немного запутались. Переменная с в твоём коде не нужна. Твоя функция заменяет первый символ в строке и всё. Причём если ей передать "", то результат не предсказуем. Нулевой байт будет заменён символом 'b'. |