Страниц: [1] 2 3
  Печать  
Автор Тема: класс string из C++  (Прочитано 29914 раз)
Pkun
Участник
*
Offline Offline

Сообщений: 1


Просмотр профиля
« : Апреля 24, 2002, 12:57:00 pm »

Подскажите, есть какие-нибудь стандартные функции для форматированной записи в объект типа string?
Наподобие как в VisualC функция CString::Format(...);
Хотелось бы записывать в строки не только другие строки, но и форматированные числа.

Ищу - не могу ничего похожего найти.
Или придется пальцами рук писать?
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #1 : Апреля 24, 2002, 01:37:00 pm »

void main(void){
char string[80];
int digit=123;
sprintf(string, "Мое целое число: %d", digit);
printf("%sn", string);
}
Подойдет? Или что-то не так понимаю в вопросе?
Если речь о классе, про который Olej упоминал
http://qnx.org.ru/forum/viewtopic.php?topic=98&forum=10&9
то к нему метод добавить надо, если нету.

[ Это Сообщение было отредактировано: ed1k в 2002-04-24 10:53 ]
Записан
Evgeniy
Jr. Member
**
Offline Offline

Сообщений: 73


Просмотр профиля
« Ответ #2 : Апреля 24, 2002, 04:40:00 pm »


Pkun пишет:
Подскажите, есть какие-нибудь стандартные функции для форматированной записи в объект типа string?
Наподобие как в VisualC функция CString::Format(...);
Хотелось бы записывать в строки не только другие строки, но и форматированные числа.

Ищу - не могу ничего похожего найти.
Или придется пальцами рук писать?


Простите, а что в C/C++ появился стандартный тип string?
На сколько мне известно, ничего похожего никакой стандарт этих языков не предусматривает.
Так что, если вы хотите что-то большее чем литерный массив и string.h, то только "пальцами рук" или у кого-нибудь позаимствовать
Записан
DigiMind
Гость
« Ответ #3 : Апреля 25, 2002, 05:01:00 am »


Простите, а что в C/C++ появился стандартный тип string?

Ну в C++ не знаю, а вот в STL - всегда был. А STL можно считать стандартной библиотекой для C++ .
Ээ.. Я в общем-то не в курсе, STL это или нет, но вот тут /usr/include/string они лежат (шаблоны для класса string).
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #4 : Апреля 25, 2002, 06:17:00 am »


Pkun пишет:
Подскажите, есть какие-нибудь стандартные функции для форматированной записи в объект типа string? Наподобие как в VisualC функция CString::Format(...);

Всё, что отвечали Pkun выше - это советы по использованию char* & char[], я думаю, он это и так знает. А вопрос выглядит, как я понимаю, так: нет ли чего более удобного?

Вопрос законный. char* & char[] - это безусловно "тяжёлое наследие" C, да и в C это пришло из B & BCPL. Ошибки операций с char* - это добрая половина всех ощибок в C++: выход за границы... Да и вообще, кто полностью внятно может объяснить, и описать все побочные эффекты, и различия вот таких фрагментов:

char* Func( void ) {
 char *S = ".......";
 ......
 return S;
};
или
char* Func( void ) {
 static char *S = ".......";
 ......
 return S;
};
или
char* Func( void ) {
 char *S = ".......";
 ......
 return strdup( S );
};

И все отличия их толкований в зависимости от компиляторов?
Это не я попридумал - смотрите Страуструпа (хоть меня тут и пинали Страуструпом) - он единственный автор этого языка!

Это к извечным (российским) вопросам "что происходит" и "кто виноват" , теперь об "что делать". Похоже, что единственный разумный путь (ввиду множества разных предложений и отсутствия каких-то компромисов для стандартизации) - это действительно прописать один раз такой класс для себя "ручками". Я это давно сделал для себя в проекте DSP, который движется и описывается в другой теме. Такой класс (String) должен иметь:

1.возможность неявного преобразования в char*, и как следствие - применимость всех str... функций C;
2.конкатенацию и конкатенацию "в лёт" (на месте), т.е., как в Java, "+" & "+=";
3.индексацию char, причём в разных контекстах: справа и слека от "=" - внимание, здесь - "засада"!;
4.гибко поддерживать кодовые страницы для QNX RTP - внутреннее представление, я думаю, UTF-8, с простыми операциями определения страницы и преобразованиями страниц на вводе/выводе (">>" & "<<");
5.что ещё ... ?

п.п.1-3 мной давно сделаны и используются, п.4 - делается. Если интересно - могу подробнее, или выслать то что есть.

Записан
Pkun
Участник
*
Offline Offline

Сообщений: 1


Просмотр профиля
« Ответ #5 : Апреля 25, 2002, 06:18:00 am »

В C++ по стандарту есть класс string. По-крайней мере об этом Страуструп пишет. Да и в /usr/include присутствуют соответствующие файлики, как уже и говорил DigiMind. При этом они еще и работают . Вот только с форматированием беда. Если, скажем сначала делать sprintf в обычную C-строку, а потом полученное значение перегонять в string, то половина смысла теряется.
Записан
DigiMind
Гость
« Ответ #6 : Апреля 25, 2002, 06:29:00 am »


В C++ по стандарту есть класс string. По-крайней мере об этом Страуструп пишет.

Он вроде бы даже ANSI стандартизирован. Точно сказать не могу .
А вот что дал быстрый курс введения в STL (ни разу его не использовал):


#include <sstream>
#include <iostream>

using namespace std;

int main()
{

   stringstream        str;
   double              d = 15.2;

   str<<"Test "<<d<<" ";

   cout<<str.str()<<endl;

   return 0;
}


За подробностями - в reference на STL.

[ Это Сообщение было отредактировано: DigiMind в 2002-04-25 03:32 ]
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #7 : Апреля 25, 2002, 08:07:00 am »


Pkun пишет:
В C++ по стандарту есть класс string. По-крайней мере об этом Страуструп пишет.

Есть - /usr/include/string (в отличии от /usr/include/string.h !). Но там собственно об строках - мало (т.е. операции и т.д.), на этом классе определены только операции сравнений (=,<,>,...) и потоковые <<, >> ...

Страуструп пишет, точнее "упоминает", и всегда в "ругательном" контексте, и тут-же показывает не на 1-ну страницу, как бы должен был быть построен пользовательский класс String.


DigiMind пишет:
А вот что дал быстрый курс введения в STL (ни разу его не использовал):

STL (/usr/include/stl.h) - ANSII стандартизованный класс расширений для "контейнеров" и итераторов над ними. Он такой же и у Watcom, MS, Borland ... Может с успехом использоваться для любых составных типов, но для представления строк там нет особых механизмов, а использовать контейнеры, скажем, для char - это "из пушки по воробьям", да и не решает это основных проблем (простой конкатенации, например). И выражения получаются "через задницу" - нечитабельны (напомню, что "читать" важнее, чем "писать" - 2-е делают 1 раз, 1-е - и сотни...).

Но самое противное - кодовые страницы. Я хотел бы иметь класс, который хранился бы и редактировался, например, в workspace - в UTF-8. Для использования в Photon без преобразований. Но я хотел бы вводить и выводить эти строки в pterm в koi-8r, cp-866, cp-1251 ... (я хотел бы это и в чистой консоли, но это во власти только Бога & QSSL ). И хотел бы, чтоб все преобразования по <<, >>, ... (?) делались автоматом как только я при инициализации приложения каким-то образом определил один раз кодовую страницу!
Записан
Pkun
Участник
*
Offline Offline

Сообщений: 1


Просмотр профиля
« Ответ #8 : Апреля 25, 2002, 12:33:00 pm »

Спасибо. Похоже строковые потоки + манипуляторы для форматирования - то, что надо!

Я вот прочитал, что потоки можно привязывать к файлам и строкам. А можно привязать поток к TCP/IP сокетам (или в общем случае, к дескрипторам)?
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #9 : Апреля 25, 2002, 01:21:00 pm »


Pkun пишет:
Я вот прочитал, что потоки можно привязывать к файлам и строкам. А можно привязать поток к TCP/IP сокетам (или в общем случае, к дескрипторам)?

К файловым дескрипторам - да, даже есть соответствующие классы fstream через которые это реализуется.

Но сокеты не являются файловыми дескрипторами, техника работы с ними другая, думаю что использовать с ними "в лоб" потоки (без прописывания дополнительных интерфейсов) - не выйдет.
Записан
Pkun
Участник
*
Offline Offline

Сообщений: 1


Просмотр профиля
« Ответ #10 : Апреля 26, 2002, 02:46:00 pm »

А можно как-нибудь читать c помощью getline в stringstream, а не в string?
Или можно обратиться напрямую к строке, к которой привязан поток? Имеется в виду на запись, а не str(), который только отдает копию строки, записанной в stringstream.
Записан
Pkun
Участник
*
Offline Offline

Сообщений: 1


Просмотр профиля
« Ответ #11 : Апреля 27, 2002, 02:29:00 pm »

Ничего себе... ! Сколько исполняемый файл весит с использованием классов string, stringstream, и с потоками. Файл разрастается с 12K (обработка строк обычными C-средствами) до 97К (обработка с помощью C++ потоков и string). Ну и здоров же он...
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #12 : Апреля 29, 2002, 03:22:00 pm »

Ну где-то здесь обсуждалось отличие C и C++, и почему ядро на C написано . Я, например, себя прекрасно чувствую с char указателями А инициализировать их как Olej выше упоминал - просто дурной тон или ошибка начинающего (хотя встречается сплошь и рядом, зачастую вполне работает). В общем, за все надо платить Сделай strip и успокойся - говорят, сейчас память ничего не стоит, даже во встраиваемых системах.
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #13 : Апреля 29, 2002, 05:39:00 pm »


ed1k пишет:
Я, например, себя прекрасно чувствую с char указателями А инициализировать их как Olej выше упоминал - просто дурной тон или ошибка начинающего (хотя встречается сплошь и рядом, зачастую вполне работает).

То, о чём "Olej выше упоминал", вообще то, мало чем отличается от char:

class String {
 char* pS;
 // а дальше "методы" ....
}

Так что в терминах эффективности это - то же самое. Проблема чистых char* в том, что здесь смешиваются два "ортогональных" (по крайней мере никак не соотносящихся друг с другом) понятия: память, выделенная под char[] и "строка" в этом char[], заканчивающаяся '' - проблема только здесь.

Затрите (по ошибке) '' в char[] - и элементарная strlen() вам вывалит ошибку защиты памяти, но это же нонсенс - физические размещения (корректность-некорректность) ставятся в зависимость от содепжимого! Всё, что должен был бы делать класс String - гарантировать согласованность размещениея с содержимым, в частности: всегда гарантировать наличие '' в пространстве строки.

Согласитесь, C/C++ определение строки (с завершающим '') - достаточно волюнтаристское: в Pascal (реализациях) строку определяют как <длина> + <содержимое>, в Perl - строка завершающаяся '
' и т.д. Почему тогда не определить String так, чтоб к нему были применимы все функции str*(), но чтобы не нужно было всякий раз следить ещё и за корректностью структуры содержимого (весьма условной структуры!)?
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #14 : Апреля 29, 2002, 05:46:00 pm »

О, чёрт! to dmi: как славно редактор форума реагирует на одиночную литеральную кавычку ! Sorry - читайте предыдущую реплику ТАК .

[ Это Сообщение было отредактировано: Olej в 2002-04-29 14:48 ]
Записан
Страниц: [1] 2 3
  Печать  
 
Перейти в: