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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как из функции получить строку? 
:(
    Опции темы
_hunter
  Дата 7.1.2004, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



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

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


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

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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
<Spawn>
Дата 7.1.2004, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Если я тебя правильно понял, то так:

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

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


Это сообщение отредактировал(а) <Spawn> - 7.1.2004, 08:00


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
bel_nikita
Дата 7.1.2004, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



char *a = new char[10];
f(char *&b)
{
...
}

Это сообщение отредактировал(а) bel_nikita - 7.1.2004, 10:29


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
setq
Дата 7.1.2004, 12:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











код в 1м сообщении очень похож на си++... но чего-то не хватает
  Вверх
_hunter
Дата 7.1.2004, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



to setq классов там не хватает smile.gif


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
mr.DUDA
Дата 7.1.2004, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



to <Spawn>
Цитата
void func(char *b)
{
       char *c;
       c = b;
       *c = 'd';
}

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

Это сообщение отредактировал(а) mr.DUDA - 7.1.2004, 22:16


--------------------
user posted image
PM MAIL WWW   Вверх
Hroft
Дата 8.1.2004, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нет, ну я не знаю конечно, но ведь вполне нормально работает...
Код

#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 изменяется сама строка - обращение-то по адресу. Или я неправ?
PM MAIL ICQ   Вверх
DENNN
Дата 8.1.2004, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

Прав. И в функции изменяется текст непосредственно по переданному адресу, т.е. при выходе из функции будет уничтожена переменная c, но не данные по преданному адресу.
PM ICQ   Вверх
mr.DUDA
Дата 8.1.2004, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



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

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

Это сообщение отредактировал(а) mr.DUDA - 8.1.2004, 21:30


--------------------
user posted image
PM MAIL WWW   Вверх
<Spawn>
Дата 9.1.2004, 04:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



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

Это сообщение отредактировал(а) <Spawn> - 9.1.2004, 05:15


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
RAN
Дата 9.1.2004, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

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



<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);
}


PM MAIL ICQ   Вверх
_hunter
Дата 9.1.2004, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



всем спасибо за участие 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' использовал цикл и все ОК


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
maxim1000
Дата 9.1.2004, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 17
Всего: 110



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

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


Это сообщение отредактировал(а) maxim1000 - 9.1.2004, 12:24


--------------------
qqq
PM WWW   Вверх
_hunter
Дата 9.1.2004, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



to maxim1000
почитай первый пост smile.gif там все написанно


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
RAN
Дата 10.1.2004, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

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



Цитата
to maxim1000
почитай первый пост  там все написанно

_hunter верно указал. Вы немного запутались. Переменная с в твоём коде не нужна.
Твоя функция заменяет первый символ в строке и всё. Причём если ей передать "", то результат не предсказуем. Нулевой байт будет заменён символом 'b'.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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