Отправляет email-рассылки с помощью сервиса Sendsay

Функция, возвращающая строку (массив), в c++

Привет всем! :-)

Может вопрос не по теме, но все же: "Никто не знает, как в C++
обозначить функцию, которая возвращала бы массив (тип элементов этого
массива - символы char)?".

Есть вариант возвратить из функции указатель на массив, но встает другая
проблема - как в C++ соединить вместе две строки, одна из которых имеет
тип char string1[...]="...", а другая этот самый указатель...

Заранее спасибо! :-)

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27117; Возраст листа: 1093; Участников: 1709
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/574156

Ответить   Sat, 22 Jul 2006 22:00:12 +0400 (#574156)

 

Ответы:

Здравствуйте Роман
В сообщении от 22 июля 2006 22:00 Роман написал(a):

char new_string[512];
char string1[256];
char *pstring1;
pstring1= string;
pstring2="Строка";
strncat(pstring1, pstring2, 10);
sprintf(new_string, "%s %s", pstring1, pstring2 );
Правда это C :)

Ответить   Sat, 22 Jul 2006 20:54:28 +0400 (#574168)

 

Хихин Руслан wrote:

Спасибо за ответ, Руслан. Твое решение еще не проверял, но за
отзывчивость спасибо. Дело в том, что я по образованию не программист
(если интересно - прочнист), но единственное руководство по C++,
свободно выложенном в инете, я нашел у Машкова, а именно, Бьерн
Страустрап "Руководство C++". В нем ни слова о внешних стандартных
модулях (хотя бы и C, а не C++), поэтому и возникают такие ламерские
вопросы.

А необходимость в C++ у меня вознила для написания программулины для
сотового - некоего менеджера для загрузки файлов с сотового и обратно.
Для винды их хоть отбавляй, но сильная любовь к линухе вызвала
потребность написать такую программу...

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27119; Возраст листа: 1093; Участников: 1709
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/574179

Ответить   Sat, 22 Jul 2006 23:40:11 +0400 (#574179)

 

В сообщении от 1153600811 секунд после начала Эпохи Роман написал(а):

А почему обязательно C++? На Python'е строки соединяются еще проще:

theString = "hello" + " " + "world"

И документация есть...

Ответить   Konstantin Korikov Mon, 24 Jul 2006 03:55:45 +0300 (#574451)

 

Hello Konstantin,

Monday, July 24, 2006, 7:55:45 AM, you wrote:

Для какого сотового пишешь?, а то я как-то для моторов писал, можно
попробовать вспомнить...

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27126; Возраст листа: 1095; Участников: 1708
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/574488

Ответить   Mon, 24 Jul 2006 12:14:12 +0700 (#574488)

 

В сообщении от Понедельник 24 Июль 2006 03:55 Konstantin Korikov написал(a):

Как ни странно, но это возможность есть с самого начала и в С++, кто у кого
утащил загадка! Но в принципе не есть хорошим решением!!!

Ответить   Поветкин Константин Sun, 30 Jul 2006 12:06:41 +0300 (#576562)

 

В сообщении от 22 июля 2006 22:00 Роман написал(a):

Вам что надо? Не в терминах - что должна принять функция и
что вернуть, а - что она должна делать.

И - почему функция. Идеология C++ - это классы со своими
методами и операторами.

Может вам подойдет std::string или std::vector<char>

Ответить   "Sergey B. Khvatov" Mon, 24 Jul 2006 11:00:13 +0400 (#574517)

 

Sergey B. Khvatov wrote:

Программа простенькая, и необходимости вводить специальные типы (т. е.
классы) нет. И как можно обойтись без функций? Даже в классе? Ведь
действия над объектами класса производятся теми же самыми фнукциями.

А что делают эти функции класса std? Можно подробнее? И вообще, где
можно взять описание всех этих классов из STL?

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27150; Возраст листа: 1096; Участников: 1712
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/574854

Ответить   Tue, 25 Jul 2006 12:35:04 +0400 (#574854)

 

Привет !

std -- это не класс, а пространство имен (namespace), классами являются
string, vector<char>, etc.

И вообще, где

Исходя из вышеизложенного ещё неплохо было бы тебе почитать любой учебник
C++, а также книга Страуструпа, "Язык C++", рекомендую.

Ответить   Tue, 25 Jul 2006 11:10:56 +0400 (#574884)

 

100% подойдет. При кодировании на C++ лучше вообще указателями и
всякими там char* да char[] пользоваться как можно меньше - меньше
гимора, надёжный код, компилятор за вас думает.

Вот отличная документация по STL (правда, с некоторыми расширениями,
которые не входят (пока?) в стандартную библиотеку):
http://www.sgi.com/tech/stl/
А ещё бы рекоменовал книги Брюса Эккеля "Философия C++" (Thinking C++
- по-английски должна быть в сети, по-русски не знаю, но можно купить)

Ответить   Tue, 25 Jul 2006 11:21:53 +0400 (#574896)

 

В сообщении от 25 июля 2006 12:35 Роман написал(a):

Конечно, под всеми рюшечками любого языка лежит одно и то
же - то что соответствует архитектуре железки. А
архитектура у них всех в общем одинаковая и достаточно
простая.

Только C++ - это другая идеология, и если вы ее не
принимаете, то использовать этот язык неудобно и вообще
глупо.

Я не знаю. Сам когда изучал читал это на
http://www.icce.rug.nl/documents/
Это толковый учебный курс, до сих пор живой и обновляемый,
но на английском

Ответить   "Sergey B. Khvatov" Tue, 25 Jul 2006 11:25:29 +0400 (#574899)

 

Вот тут я бы хотел не согласиться :)
Есть довольно много вещей, которые мы не понимаем (до конца, во всяком
случае), но которыми не можем не ползоваться. Вспоминается
высказывание Хевисайда (кажется) относительно применения
преобразования Лапласа - "мы не понимаем, как работает пищевариение,
но не отказываем себе в хорошем ужине".

Так и с C++ - можно не очень разбираться в идеологии STL, а знать
несколько практических приёмов - и при этом начисто избавиться от
указателей, а взамен получить кучу простых в применении классов и
алгоритмов, позволяющих строить программы с такой же лёгкостью, как,
например, на Python (ну, почти). Есть, конечно, и оборотная сторона:
можно попасть в ситуацию, когда диагностика компилятора будет
абсолютна непонятна. А всё из-за какой-нибудь маленькой синтаксичекой
ошибки.

Ответить   Tue, 25 Jul 2006 11:54:09 +0400 (#574907)

 

В сообщении от 25 июля 2006 11:54 Vladimir Efremov
написал(a):

Наверное я высказался слишком категорично - не идеология, а
модель. Особенно, если помнить, что все это реализует
единственная (если отбросить детали) платформа с
Фон-Неймановской архитектурой. То есть все эти модели - это
в основном способ представить то же самое с той или другой
стороны.

C++ - это реализация объектно-ориентированной модели
программирования. На мой взгляд удачная - то есть
соответствующая роли самой этой модели (опять же - по моему
мнению). И использовать этот язык нужно не всегда. Для меня
он удобен только в больших проектах, когда нужна
самодисциплина или интерфейс между исполнителями.

Наверное сказывается моя нынешняя ситуация, когда приходится
делать и тонкого клиента на C (это железка с Linux - не
Intel, но с 4Mb flash + 16 Mb RAM) и "умный" сервер на
достаточных ресурсах, где мне больше подходит C++
Как-то с одной стороны переключаться тяжело, но с другой я
знаю или догадываюсь, как C++ + библиотека реализуют то,
что я от них хочу (и возможно поэтому я не использую C++ на
клиенте, хотя такая возможность есть)

А насчет странных синтаксических ошибок в C++ - изучайте его
лучше и не стесняйтесь использовать "самоограничивающие"
конструкции: const, throw, explicit,.. - помогает :-)

Ответить   "Sergey B. Khvatov" Tue, 25 Jul 2006 14:41:56 +0400 (#574969)

 

On 7/25/06, Sergey B. Khvatov <xbat***@t*****.ru> wrote:

Я имел в виду диагностики, связанные, например, с разрешением шаблонов
- неоднократно был свидетелем как начинающие программисты на C++
становились в тупик перед каскадом совершенно им непонятных сообщений
- и никакие const и т.п. тут не помогут. Вот коротенький пример:
#include <iostream>
#include <cstdlib>

void qq()
{
return;
}

int main()
{
std::cout << "qq " << qq() << std::endl;
return EXIT_SUCCESS;
}
Ясно, что программист (случайно, наверное - могут быть функции с
похожими именами) пытается вывести значение функции, которая не
возвращает значения. Сообщения компилятора мало того, что обильны и
прямо об этом не говорят, но и у неопытного программиста есть
тенденция ориентироваться на то, что компилятор говорит в самом конце
(компилятор, кстати, gcc 3.3.5)! Ясно, что это безнадёга.

syntax.cpp: In function `int main()':
syntax.cpp:11: error: no match for 'operator<<' in 'std::operator<< [with
_Traits = std::char_traits<char>]((&std::cout), "qq ") << qq()'
/usr/include/c++/3.3/bits/ostream.tcc:63: error: candidates are:
std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
_Traits>::operator<<(std::basic_ostream<_CharT,
_Traits>&(*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char,
_Traits = std::char_traits<char>]

[пропущено много строк, понятных только тем, кто знает, что такое
шаблоны и как с ними работают]

/usr/include/c++/3.3/bits/ostream.tcc:512: error:
std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
_Traits>&, char) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3/ostream:436: error:
std::basic_ostream<_CharT, _Traits>&
std::operator<<(std::basic_ostream<_CharT, _Traits>&, char) [with _CharT =
char, _Traits = std::char_traits<char>]

В так называемых "визуальных средах" не пробовал, но думаю, что там
диагностика будет не лучше. Впрочем, попробую, как руки дойдут -
просто интересно.

Ответить   Wed, 26 Jul 2006 13:13:02 +0400 (#575688)

 

Здравствуйте, Роман.

22.07.2006 22:00 Вы писали:

char* func();

Вообще-то это один и тот же тип :). Просто в первом случае память под
строку выделяется сразу.

Если нужна функция соединяющая строки:

char* srt_sum(const char* str1, const char* str2)
{
char *str;
str = (char*)malloc(strlen(str1) + strlen(str2) +1);
if (str == NULL)
return NULL;
strcpy(str, str1);
strcat(str, str2);
return str;
};

Что-то типа этого. Память потом только освободить надо...

Ответить   Иваненко Денис Mon, 24 Jul 2006 08:31:18 +0400 (#574677)

 

В сообщении от Суббота 22 Июль 2006 21:00 Роман написал(a):

Как бы на самом деле char string1[...]="..." и char *string1 одно и тоже,
соединяй скок хочешь!

Ответить   Поветкин Константин Sun, 30 Jul 2006 12:02:09 +0300 (#576560)

 

Попробуйте использовать STL.

#include <string>
std::string test1;
std::string test2 = "hello";
test1 = std::string(" ") + "Word";
test2 += test1;

Поветкин Константин <povetkin***@m*****.ru>
30.07.2006 13:02
Срок ответа для: 9816646-comp.soft.linux.discuss-list

Кому: "comp.soft.linux.discuss" <arch***@a*****.ru> (9816646)
Копия:
Тема: Re: Функция, возвращающая строку (массив), в c++

В сообщении от Суббота 22 Июль 2006 21:00 Роман написал(a):

Как бы на самом деле char string1[...]="..." и char *string1 одно и тоже,

соединяй скок хочешь!