string
От: Аноним  
Дата: 11.07.03 09:06
Оценка:
Помогите, пожалуйста, начинающему разобраться

Что-то я не пойму до конца всю прелесть типа string.
Как мне получить доступ к самомоу буферу? Ведь c_str() возвращает константу :\
Например, как мне использовать тип string для получения текста окна?

string s("");
GetWindowText(...???...);

...И еще один маленький вопросик, как можно отформатировать эту строку?.. Конечно, если получить доступ к буферу, то вопрос снимается — sprintf, а есть ли встроенный метод, что-то я его не нашел. Спасибо!
Re: string
От: MaximE Великобритания  
Дата: 11.07.03 09:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Что-то я не пойму до конца всю прелесть типа string.

А> Как мне получить доступ к самомоу буферу? Ведь c_str() возвращает константу :\

Такой возможности нет.

А> Например, как мне использовать тип string для получения текста окна?


А> string s("");

А> GetWindowText(...???...);

Используй std::vector<> или MFC/ATL CString.

А> ...И еще один маленький вопросик, как можно отформатировать эту строку?.. Конечно, если получить доступ к буферу, то вопрос снимается — sprintf, а есть ли встроенный метод, что-то я его не нашел. Спасибо!


Используй boost::format или std::stringstream. На крайняк MFC/ATL CString и sprintf в их буфер.
Re: string
От: Vamp Россия  
Дата: 11.07.03 09:22
Оценка:
А> Например, как мне использовать тип string для получения текста окна?

А> string s("");

А> GetWindowText(...???...);

Используй промежуточную строку типа LPCSTR.
Да здравствует мыло душистое и веревка пушистая.
Re: string
От: deviv  
Дата: 11.07.03 09:28
Оценка:
Меня эта "недоделанность" всегда раздражала:
класс string есть
другие классы этой библиотеки его не использует практически нигде, обычно все сводится к char* (см. exception, stringstream)
возможности использовать с уже существующем кодом минимальны (нет поступа к буфферу)
функций форматирования нету (разве что опять через char* так или иначе)
... << RSDN@Home 1.1 beta 1 >>
WBR,
Влад Волосюк
Re[2]: string
От: EM Великобритания  
Дата: 11.07.03 09:28
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, Аноним, Вы писали:


А>> Что-то я не пойму до конца всю прелесть типа string.

А>> Как мне получить доступ к самомоу буферу? Ведь c_str() возвращает константу :\

ME>Такой возможности нет.


Вот в этом — то и прелесть — более безопасный код
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re: string
От: PM  
Дата: 11.07.03 09:31
Оценка:
> Что-то я не пойму до конца всю прелесть типа string.
> Как мне получить доступ к самомоу буферу? Ведь c_str() возвращает
> константу :\ Например, как мне использовать тип string для получения
> текста окна?
>
> string s("");
> GetWindowText(...???...);

Тов. Майерс в "Effective STL" пишет, что для этого нужно использовать промежуточный буфер, примерно так:
    std::vector<char> buf(1024);
    buf.resize( GetWindowText( m_hWnd, &buf[0],  buf.capacity() ) );
    std::string window_text = buf;


> ...И еще один маленький вопросик, как можно отформатировать эту

> строку?.. Конечно, если получить доступ к буферу, то вопрос снимается -
> sprintf, а есть ли встроенный метод, что-то я его не нашел. Спасибо!

Аналогично, воспользоваться промежуточным буфером std::vector<char>
Posted via RSDN NNTP Server 1.6 RC1
Re[2]: string
От: Аноним  
Дата: 11.07.03 09:31
Оценка:
Здравствуйте, MaximE, Вы писали:

А>> string s("");

А>> GetWindowText(...???...);

ME>Используй std::vector<> или MFC/ATL CString.


А>> ...И еще один маленький вопросик, как можно отформатировать эту строку?.. Конечно, если получить доступ к буферу, то вопрос снимается — sprintf, а есть ли встроенный метод, что-то я его не нашел. Спасибо!


ME>Используй boost::format или std::stringstream. На крайняк MFC/ATL CString и sprintf в их буфер.


То есть ты хочешь подтвердить мое мнение о том, что ситуация плоха? Дык, а в чем тогда секрет? Почему нельзя было сделать по-человечески (только не говори, что это вопрос к тем, кто делал ).
А в чем тогда вообще смысл этого string, если для вызова ЛЮБОЙ функции нужно вводить дополнительные типы?????????? Бред!?
Например, сейчас мне нужно вызвать CharLower для string... Это что ж мне нужно объявлять char * перегонять туда стринг и опять обратно????? :\

Удалено избыточное цитирование. -- ПК.
Re[2]: string
От: Аноним  
Дата: 11.07.03 09:35
Оценка:
Здравствуйте, PM, Вы писали:

>> ...И еще один маленький вопросик, как можно отформатировать эту

>> строку?.. Конечно, если получить доступ к буферу, то вопрос снимается -
>> sprintf, а есть ли встроенный метод, что-то я его не нашел. Спасибо!

PM>Аналогично, воспользоваться промежуточным буфером std::vector<char>


Это замечательно, но... зачем такой огород?... эх.. понял... не задавать глупых вопросов...
Ладно, но неужели нет хорошей и достаточно совметимой со всем библиотеки, которая позволила бы быстро работать со стоками и имела бы МИНИМАЛЬНЫЙ набор полезных функций??? МИНИМАЛЬНЫЙ — имеется в виду: поиск, форматирование, изменение регистра, корректное и простое удаление и т.д. ?

Удалено избыточное цитирование. -- ПК.
Re[2]: string
От: Vamp Россия  
Дата: 11.07.03 09:36
Оценка:
    std::vector<char> buf(1024);
    buf.resize( GetWindowText( m_hWnd, &buf[0],  buf.capacity() ) );
    std::string window_text = buf;


Гм... А будет ли сие работать корректно, если строка формируемая GetWindowText, паче чаяния, превысит 1023 символа? Если речь идет не о кепшине, а о содержимом контрола, ситуация становится вполне вероятной...
Да здравствует мыло душистое и веревка пушистая.
Re[3]: string
От: deviv  
Дата: 11.07.03 09:40
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А> Это замечательно, но... зачем такой огород?... эх.. понял... не задавать глупых вопросов...

А> Ладно, но неужели нет хорошей и достаточно совметимой со всем библиотеки, которая позволила бы быстро работать со стоками и имела бы МИНИМАЛЬНЫЙ набор полезных функций??? МИНИМАЛЬНЫЙ — имеется в виду: поиск, форматирование, изменение регистра, корректное и простое удаление и т.д. ?

Я понял!!!
string — это такой академический пример, что разработчики библиотек договорились не реализовывать этот класс нормально — пусть студенты мучаются!
... << RSDN@Home 1.1 beta 1 >>
WBR,
Влад Волосюк
Re[3]: string
От: Toughpheeckouse Россия  
Дата: 11.07.03 09:47
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Гм... А будет ли сие работать корректно, если строка формируемая GetWindowText, паче чаяния, превысит 1023 символа? Если речь идет не о кепшине, а о содержимом контрола, ситуация становится вполне вероятной...


дык. я так понимаю, PM написал примерный код, а получить длину текста можно с помощью GetWindowTextLength().
Думайте сами, решайте сами...
Re[3]: string
От: PM  
Дата: 11.07.03 09:49
Оценка:
??>>> Что-то я не пойму до конца всю прелесть типа string.
??>>> string s("");
??>>> GetWindowText(...???...);
>
PM>> Тов. Майерс в "Effective STL" пишет, что для этого нужно использовать
PM>> промежуточный буфер, примерно так:
   std::vector<char> buf(1024); 
 PM>> buf.resize( GetWindowText( m_hWnd, &buf[0],  buf.capacity() ) );  
 PM>> std::string window_text = buf;


> Это замечательно, но... зачем такой огород?... эх.. понял... не

> задавать глупых вопросов...

Это делается для поддержки старых API, работающих с массивами и строками C.
Настоящие С++ стараются всегда использовать string и vector

> Ладно, но неужели нет хорошей и достаточно совметимой со всем библиотеки,

> которая позволила бы быстро работать со стоками и имела бы МИНИМАЛЬНЫЙ
> набор полезных функций??? МИНИМАЛЬНЫЙ — имеется в виду: поиск,
> форматирование, изменение регистра, корректное и простое удаление и т.д.
> ?

На всех не угодишь — напиши свою реализацию Но далеко не факт, что у тебя получится универсальнее/эффективнее и без багов
Posted via RSDN NNTP Server 1.6 RC1
Re[3]: string
От: PM  
Дата: 11.07.03 09:51
Оценка:
V>
 V>     std::vector<char> buf(1024);
 V>     buf.resize( GetWindowText( m_hWnd, &buf[0],  buf.capacity() ) );
 V>     std::string window_text = buf;
 V>

V>
V> Гм... А будет ли сие работать корректно, если строка формируемая
V> GetWindowText, паче чаяния, превысит 1023 символа? Если речь идет не о
V> кепшине, а о содержимом контрола, ситуация становится вполне
V> вероятной...
Строка отрежется. Не принимай близко к сердцу -это ж только пример
А специально для GetWindowText есть GetWindowTextLength
Posted via RSDN NNTP Server 1.6 RC1
Re[3]: string
От: MaximE Великобритания  
Дата: 11.07.03 09:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А> То есть ты хочешь подтвердить мое мнение о том, что ситуация плоха? Дык, а в чем тогда секрет? Почему нельзя было сделать по-человечески (только не говори, что это вопрос к тем, кто делал ).

А> А в чем тогда вообще смысл этого string, если для вызова ЛЮБОЙ функции нужно вводить дополнительные типы?????????? Бред!?
А> Например, сейчас мне нужно вызвать CharLower для string... Это что ж мне нужно объявлять char * перегонять туда стринг и опять обратно????? :\

Дело в том, что все эти функции — это C API. Классы stl не предоставляют средств для автоматизации работы с унаследованными API. Для этой цели предназначены такие библиотеки, как MFC и ATL.
Re[3]: string
От: small_cat Россия  
Дата: 11.07.03 09:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, PM, Вы писали:


>>> Что-то я не пойму до конца всю прелесть типа string.

>>> Как мне получить доступ к самомоу буферу? Ведь c_str() возвращает
>>> константу :\ Например, как мне использовать тип string для получения
>>> текста окна?
>>>
Естественно! А как иначе? std::string содержит в себе механизмы работы с сырой памятью, механизмы кеширования и др. В этой ситуации доступ к буферу есть дело некорректное. Грабли, т.е. А c_str возвращает константную ссылку. Типа никто не запрещает читать из этого буфера

PM>>Аналогично, воспользоваться промежуточным буфером std::vector<char>


А> Это замечательно, но... зачем такой огород?... эх.. понял... не задавать глупых вопросов...

А в чем огород? Да, с одной стороны можно было бы встроить механизм форматирования в std::string (как это сделано в CString), но... С точки зрения универсальносит и расширяемости стандартной библиотеки, ее безопасности это излишне. Для трюкачества есть механизм, предложенный выше. Для работы со строками есть std::string. Кстати, где то в форуме пробегал класс для форматирования оформленный в стиле std

А> Ладно, но неужели нет хорошей и достаточно совметимой со всем библиотеки, которая позволила бы быстро работать со стоками и имела бы МИНИМАЛЬНЫЙ набор полезных функций??? МИНИМАЛЬНЫЙ — имеется в виду: поиск, форматирование, изменение регистра, корректное и простое удаление и т.д. ?

Что значит совместимыми со всеми библиотеками? типа, std "должны быть совместима с набором функций для поиска фирмы Пупкин и сыновья"? Что касается основных функций для работы со строками, то они представлены в изобилии. см., например, главу 20 "Язык программирования С++"
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков
Re[4]: string
От: Аноним  
Дата: 11.07.03 11:18
Оценка:
Здравствуйте, PM, Вы писали:

PM>На всех не угодишь — напиши свою реализацию Но далеко не факт, что у тебя получится универсальнее/эффективнее и без багов


Да, я помню как кто-то тут уже поднимал вопрос о том, чтобы написать нормальный стринг! Так ведь значит не только я мучаюсь!
Не понимаю все равно... MFC ATL WTL ...это все хорошо, но почему бы не мделать встроенные в язык средства, чтобы люди не городили изо дня в день свои кривые (или не кривые) функции поиска, форматирования и т.д...???

Удалено избыточное цитирование. -- ПК.
Re[4]: string
От: Аноним  
Дата: 11.07.03 11:21
Оценка:
Здравствуйте, small_cat, Вы писали:

А>> Ладно, но неужели нет хорошей и достаточно совметимой со всем библиотеки, которая позволила бы быстро работать со стоками и имела бы МИНИМАЛЬНЫЙ набор полезных функций??? МИНИМАЛЬНЫЙ — имеется в виду: поиск, форматирование, изменение регистра, корректное и простое удаление и т.д. ?

_>Что значит совместимыми со всеми библиотеками? типа, std "должны быть совместима с набором функций для поиска фирмы Пупкин и сыновья"? Что касается основных функций для работы со строками, то они представлены в изобилии. см., например, главу 20 "Язык программирования С++"

Плохо выразился. Я имел в виду что-то сделанное на основе char * так, чтобы это было легко применять и в MFC и в ATL и в WTL.
Просто мне не совсем понятно, зачем было писать string, если он, в принципе, недоделан до того, чтобы его можно было легко использовать. Иногда он усложняет жизнь, а не упрощает! ...

Удалено избыточное цитирование. -- ПК.
Re: string
От: Ash-2 Россия  
Дата: 11.07.03 11:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Помогите, пожалуйста, начинающему разобраться


А> Что-то я не пойму до конца всю прелесть типа string.

А> Как мне получить доступ к самомоу буферу? Ведь c_str() возвращает константу :\
А> Например, как мне использовать тип string для получения текста окна?

Когда я сам был начинающим (месяца три назад ), столкнувшись точно с такой проблемой, написал свой строковый класс (это был первый класс на С++). Глючил он безбожно, но учитывая наличие всех исходников, где-то в течении года баги исправлялись (я набирался опыта) и даже месяца два у меня небыло к нему никаких претензий... но, на днях нашелся очередной баг
В моем случае прога строилась на WinAPI, и поэтому советы типа:
"Это все устарело..."
"Используйте mfc, vcl..."
не рассматривались.

Вывод: со стандартными классами придется все делать через ж..., НО можно быть практически уверенным, что они НЕ будут глючить. Со своими все наоборот
Правда, может я один такой
Re[2]: string
От: Аноним  
Дата: 11.07.03 11:38
Оценка:
Здравствуйте, PM, Вы писали:

PM>
PM>    std::vector<char> buf(1024);
PM>    buf.resize( GetWindowText( m_hWnd, &buf[0],  buf.capacity() ) );
PM>    std::string window_text = buf;
PM>


А ты тестировал код? У меня тут (в моем С )))) )нельзя присвоить std::string window_text = buf...

Удалено избыточное цитирование. -- ПК.
Re[5]: string
От: PM  
Дата: 11.07.03 15:35
Оценка:
PM>> На всех не угодишь — напиши свою реализацию Но далеко не факт, что
PM>> у тебя получится универсальнее/эффективнее и без багов
>
> Да, я помню как кто-то тут уже поднимал вопрос о том, чтобы написать
> нормальный стринг! Так ведь значит не только я мучаюсь! Не понимаю все
> равно... MFC ATL WTL ...это все хорошо, но почему бы не мделать
> встроенные в язык средства, чтобы люди не городили изо дня в день свои
> кривые (или не кривые) функции поиска, форматирования и т.д...???

Каждый "реальный" программист должен написать свой класс строки (c) не помню
Posted via RSDN NNTP Server 1.6 RC1
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.