Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

std::string S.size()

08.09.2013, 23:22. Показов 2470. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему?
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main()
{
   std::string FIO="Ковалёв Алексей Никифорович";   
   std::cout<<FIO.size()<<"\n";
   
   return 0;
}
мне отдает 52?

Не по теме:


сильно не бейте, c Linux едва знаком

0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.09.2013, 23:22
Ответы с готовыми решениями:

Не освобождается память std::string после использования std::bind
Всем привет! Есть система, которая подгружает из внешних библиотек функции, упаковывает их в std::bind и заносит в...

Свой аналог std::string
Я щас делаю свою реализацию строк, назвав их типом TString. Кинуть тебе, когда отлажу?

Std::string портит память
Столкнулся с интересной проблемой. Лет 6 назад использовал одну прогу под ASPLinux 7.2. Исходники компилировались нормально и прога...

10
1265 / 979 / 384
Регистрация: 02.09.2012
Сообщений: 3,026
08.09.2013, 23:39
UTF-8 кодировка символов компилятором.
25 русских букв в UTF8 это будет 50 байт + 2 байта пробельных символа = 52.
Все честно!
2
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
09.09.2013, 01:23  [ТС]
Это другой вопрос, но он не стоит того, чтоб целую тему создавать.
C++
1
2
   std::string FIO="Ковалёв Алексей Никифорович";   
   std::cout<<FIO[1]<<"\n";
выводит вопрос в ромбике, а я бы хотел видеть символ из строки.
0
...
 Аватар для anmartex
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
09.09.2013, 11:59
Для таких целей необходимо использовать wstring
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
#include <locale>
 
int main()
{
    std::setlocale(LC_ALL, "");
 
    std::wstring text = L"Ковалёв Алексей Никифорович";
 
    std::wcout << text << std::endl;
 
    std::wcout << text[0] << std::endl;
 
    return 0;
}
2
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
09.09.2013, 18:16
16-битные символы, как рекомендует anmartex, пожалуй, лучшее решение.
Или, если уж хотите остаться на utf-8
C++
1
2
3
4
5
6
#include <iostream>
 
main() {
 std::string FIO="Ковалёв Алексей Никифорович";
 std::cout<<FIO[0]<<FIO[1]<<"\n";
}
Подсчет индексов тогда ложится на вас.
0
1265 / 979 / 384
Регистрация: 02.09.2012
Сообщений: 3,026
10.09.2013, 14:53
Лучший ответ Сообщение было отмечено как решение

Решение

Слово "индекс" я бы назвал опасным в контексте данного топика.
Это для русских букв в юникоде повезло. Кодирование в utf-8 будет давать по два байта.
Но в общем случае - это не так (есть символы по 3 байта и по 4 байта).
Если уж работаем с локалью, то как взрослые!! собственно как и указал anmartex.
А работая с индексами, неизбежно упираешь в кодирование utf-8 (если оно конечно такое в системе).
Спрашивается нафига это делать самому, если система дает цивилизованные средства для работы с локалью.
3
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
10.09.2013, 22:27
Кто бы спорил. Программа, работающая с любой локалью, предпочтительнее.
Но, думаю, есть задачи, где все же имеет смысл побайтно разбитать утф-8.
спрашивается нафига это делать самому, если система дает цивилизованные средства для работы с локалью.
Я. например, не знаю, как этими цивилизованными средствами, хотя бы решить простейшую задачу автора топика - посчитать количесво символов в строке утф-8, не используя сторонних библиотек и не разбирая строку побайтно.
Далеко не всегда строка задается в виде константы или читается с cin (wcin).
0
10.09.2013, 23:28  [ТС]

Не по теме:

Извините, что вмешиваюсь, но
индекс, он и в Африке индекс.
символ в любом случае не есть индекс.

Цитата Сообщение от gng Посмотреть сообщение
Подсчет индексов символов тогда ложится на вас.
просто говорите правильно сразу.

0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
11.09.2013, 07:14
daslex
Согласен, в данном контексте речь идет о подсчете символом, и мое выражение "подсчет индексов" не совсем корректно.
Но ваш пример
C++
1
2
std::string FIO="Ковалёв Алексей Никифорович";   
std::cout<<FIO[1]<<"\n";
недвузначно намекает на индексирование.
0
1265 / 979 / 384
Регистрация: 02.09.2012
Сообщений: 3,026
11.09.2013, 16:30
Что то мы флейм развели на пустом месте...
Отвечу в продолжении, хотя особого смысла дальше спорить не вижу, собственно и спорить-то не о чем и так все понятно.
Получить длину строки в !!!символах!!!
C++
1
2
std::wstring text = L"Ковалёв Алексей Никифорович";
std::wcout << text.length() << std::endl;
Без сторонней бибилиотеки - это вы правы, но STL - это стандарт, ее уже нельзя назвать сторонней.
Кстати достойный ресурс: www.cplusplus.com
Когда мне чего-нибудь надо из STL, я обращаюсь именно туда.
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
11.09.2013, 17:52
anmartex работу с 16-битными строками уже продемонстрировал.
Но я спрашивал о другом, а именно, как по взрослому цивилизованными средствами посчитать количесво символов в строке UTF-8.
И дальше
Далеко не всегда строка задается в виде константы или читается из wcin[/B]
Т.е есть string, или char*, представляющая из себя текст в ютф-8 (а не utf-16, как в вашем примере). Нужно посчитать кол-во символов, например, следуя вашей логике, преобразовав ее в 16-битную строку.
STL и любые другие стандартные библиотеки трудно назвать сторонними. Но достаточно ли их?

PS. www.cplusplus.com - действительно достойный ресурс.

Добавлено через 27 минут
В догонку.
Прошу прощения за настырность. Просто в свое время (пару лет назад) я не нашел в рамках stdc++ (STL) способа превода string в wstring. Конструкторы wsrting и потоки wstringstream обламывались, когда встречали многобайтные символы. Вот и заинтеросовался :-).

Добавлено через 1 минуту
В догонку.
Прошу прощения за настырность. Просто в свое время (пару лет назад) я не нашел в рамках stdc++ (STL) способа превода string в wstring. Конструкторы wsrting и потоки wstringstream обламывались, когда встречали многобайтные символы. Вот и заинтеросовался :-).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.09.2013, 17:52
Помогаю со студенческими работами здесь

free(): invalid next size (fast)
Не могу понять в чем ошибка.. Debian lenny *** glibc detected *** /home/user/eits/trunk/eits: free(): invalid next size (fast):...

Не могу разобраться как обновить в std::map<std::string, вектор_структур>
Не могу разобраться как обновить вектор структур после его добавления в map без удаления и перезаписи struct pStruct { int...

std::string, std::fstream, ошибка кучи
где то начало вылетать при операции += с локальной переменной std::string. Заменил на свой qString. Замечательно, то же самое... ошибка при...

Файловый поток и std::string
добрый день сейчас меня немножко ввело в тупняк - из файлового потока(ifstream) нельзя прочитать по словам типа std::string? только char*...

Немного про std::string
Привет, читал про std::string на разных сайтах. 1. Там говорят, С++ 11 гарантирует, что std::string будет stored contiguously in...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru