Что-то я не пойму до конца всю прелесть типа string.
Как мне получить доступ к самомоу буферу? Ведь c_str() возвращает константу :\
Например, как мне использовать тип string для получения текста окна?
string s("");
GetWindowText(...???...);
...И еще один маленький вопросик, как можно отформатировать эту строку?.. Конечно, если получить доступ к буферу, то вопрос снимается — sprintf, а есть ли встроенный метод, что-то я его не нашел. Спасибо!
Здравствуйте, Аноним, Вы писали:
А> Что-то я не пойму до конца всю прелесть типа string. А> Как мне получить доступ к самомоу буферу? Ведь c_str() возвращает константу :\
Такой возможности нет.
А> Например, как мне использовать тип string для получения текста окна?
А> string s(""); А> GetWindowText(...???...);
Используй std::vector<> или MFC/ATL CString.
А> ...И еще один маленький вопросик, как можно отформатировать эту строку?.. Конечно, если получить доступ к буферу, то вопрос снимается — sprintf, а есть ли встроенный метод, что-то я его не нашел. Спасибо!
Используй boost::format или std::stringstream. На крайняк MFC/ATL CString и sprintf в их буфер.
Меня эта "недоделанность" всегда раздражала:
класс string есть
другие классы этой библиотеки его не использует практически нигде, обычно все сводится к char* (см. exception, stringstream)
возможности использовать с уже существующем кодом минимальны (нет поступа к буфферу)
функций форматирования нету (разве что опять через char* так или иначе)
Здравствуйте, MaximE, Вы писали:
ME>Здравствуйте, Аноним, Вы писали:
А>> Что-то я не пойму до конца всю прелесть типа string. А>> Как мне получить доступ к самомоу буферу? Ведь c_str() возвращает константу :\
ME>Такой возможности нет.
Вот в этом — то и прелесть — более безопасный код
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
> Что-то я не пойму до конца всю прелесть типа string. > Как мне получить доступ к самомоу буферу? Ведь c_str() возвращает > константу :\ Например, как мне использовать тип string для получения > текста окна? > > string s(""); > GetWindowText(...???...);
Тов. Майерс в "Effective STL" пишет, что для этого нужно использовать промежуточный буфер, примерно так:
> ...И еще один маленький вопросик, как можно отформатировать эту > строку?.. Конечно, если получить доступ к буферу, то вопрос снимается - > sprintf, а есть ли встроенный метод, что-то я его не нашел. Спасибо!
Здравствуйте, 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>
Это замечательно, но... зачем такой огород?... эх.. понял... не задавать глупых вопросов...
Ладно, но неужели нет хорошей и достаточно совметимой со всем библиотеки, которая позволила бы быстро работать со стоками и имела бы МИНИМАЛЬНЫЙ набор полезных функций??? МИНИМАЛЬНЫЙ — имеется в виду: поиск, форматирование, изменение регистра, корректное и простое удаление и т.д. ?
Гм... А будет ли сие работать корректно, если строка формируемая GetWindowText, паче чаяния, превысит 1023 символа? Если речь идет не о кепшине, а о содержимом контрола, ситуация становится вполне вероятной...
Здравствуйте, <Аноним>, Вы писали:
А> Это замечательно, но... зачем такой огород?... эх.. понял... не задавать глупых вопросов... А> Ладно, но неужели нет хорошей и достаточно совметимой со всем библиотеки, которая позволила бы быстро работать со стоками и имела бы МИНИМАЛЬНЫЙ набор полезных функций??? МИНИМАЛЬНЫЙ — имеется в виду: поиск, форматирование, изменение регистра, корректное и простое удаление и т.д. ?
Я понял!!!
string — это такой академический пример, что разработчики библиотек договорились не реализовывать этот класс нормально — пусть студенты мучаются!
Здравствуйте, Vamp, Вы писали:
V>Гм... А будет ли сие работать корректно, если строка формируемая GetWindowText, паче чаяния, превысит 1023 символа? Если речь идет не о кепшине, а о содержимом контрола, ситуация становится вполне вероятной...
дык. я так понимаю, PM написал примерный код, а получить длину текста можно с помощью GetWindowTextLength().
??>>> Что-то я не пойму до конца всю прелесть типа string.
??>>> string s("");
??>>> GetWindowText(...???...); > PM>> Тов. Майерс в "Effective STL" пишет, что для этого нужно использовать PM>> промежуточный буфер, примерно так:
> Это замечательно, но... зачем такой огород?... эх.. понял... не > задавать глупых вопросов...
Это делается для поддержки старых API, работающих с массивами и строками C.
Настоящие С++ стараются всегда использовать string и vector
> Ладно, но неужели нет хорошей и достаточно совметимой со всем библиотеки, > которая позволила бы быстро работать со стоками и имела бы МИНИМАЛЬНЫЙ > набор полезных функций??? МИНИМАЛЬНЫЙ — имеется в виду: поиск, > форматирование, изменение регистра, корректное и простое удаление и т.д. > ?
На всех не угодишь — напиши свою реализацию Но далеко не факт, что у тебя получится универсальнее/эффективнее и без багов
V> V> Гм... А будет ли сие работать корректно, если строка формируемая V> GetWindowText, паче чаяния, превысит 1023 символа? Если речь идет не о V> кепшине, а о содержимом контрола, ситуация становится вполне V> вероятной...
Строка отрежется. Не принимай близко к сердцу -это ж только пример
А специально для GetWindowText есть GetWindowTextLength
Здравствуйте, Аноним, Вы писали:
А> То есть ты хочешь подтвердить мое мнение о том, что ситуация плоха? Дык, а в чем тогда секрет? Почему нельзя было сделать по-человечески (только не говори, что это вопрос к тем, кто делал ). А> А в чем тогда вообще смысл этого string, если для вызова ЛЮБОЙ функции нужно вводить дополнительные типы?????????? Бред!? А> Например, сейчас мне нужно вызвать CharLower для string... Это что ж мне нужно объявлять char * перегонять туда стринг и опять обратно????? :\
Дело в том, что все эти функции — это C API. Классы stl не предоставляют средств для автоматизации работы с унаследованными API. Для этой цели предназначены такие библиотеки, как MFC и ATL.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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, если он, в принципе, недоделан до того, чтобы его можно было легко использовать. Иногда он усложняет жизнь, а не упрощает! ...
Здравствуйте, Аноним, Вы писали:
А> Помогите, пожалуйста, начинающему разобраться
А> Что-то я не пойму до конца всю прелесть типа string. А> Как мне получить доступ к самомоу буферу? Ведь c_str() возвращает константу :\ А> Например, как мне использовать тип string для получения текста окна?
Когда я сам был начинающим (месяца три назад ), столкнувшись точно с такой проблемой, написал свой строковый класс (это был первый класс на С++). Глючил он безбожно, но учитывая наличие всех исходников, где-то в течении года баги исправлялись (я набирался опыта) и даже месяца два у меня небыло к нему никаких претензий... но, на днях нашелся очередной баг
В моем случае прога строилась на WinAPI, и поэтому советы типа:
"Это все устарело..."
"Используйте mfc, vcl..."
не рассматривались.
Вывод: со стандартными классами придется все делать через ж..., НО можно быть практически уверенным, что они НЕ будут глючить. Со своими все наоборот
Правда, может я один такой
PM>> На всех не угодишь — напиши свою реализацию Но далеко не факт, что PM>> у тебя получится универсальнее/эффективнее и без багов > > Да, я помню как кто-то тут уже поднимал вопрос о том, чтобы написать > нормальный стринг! Так ведь значит не только я мучаюсь! Не понимаю все > равно... MFC ATL WTL ...это все хорошо, но почему бы не мделать > встроенные в язык средства, чтобы люди не городили изо дня в день свои > кривые (или не кривые) функции поиска, форматирования и т.д...???
Каждый "реальный" программист должен написать свой класс строки (c) не помню