Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/103: Рейтинг темы: голосов - 103, средняя оценка - 4.84
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056

Функция size() стандартного класса string

31.08.2012, 10:20. Показов 22039. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. При поптыке посчитать количество символов в введённой строке на латыне - отображает верный результат, а кириллицу читает неправильно. Компилятор GNU C++. В чём может быть дело и как исправить эту ошибку?

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
  string line;
  cout << "Введите, пожалуйста, фразу: " << endl;
  getline(cin, line);
  cout << line.size();
  return 0;
}
Если ввести: Hello World! Результат будет 12
Если ввести: Привет Мир! Результат будет 20
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.08.2012, 10:20
Ответы с готовыми решениями:

Выход из цикла методом size() класса string
Подскажите пожалуйста, как происходит выход из цикла в следующем коде? После того как все 'g' заменятся на '7', переменная x должна...

Функция ввода для класса string
Я вот решил написать свою версию класса string. Просто для себя, чтобы понять как оно работает. Но застрял на одной функции, а именно ввода...

std::string S.size()
Почему? #include &lt;iostream&gt; int main() { std::string FIO=&quot;Ковалёв Алексей Никифорович&quot;; ...

42
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
31.08.2012, 10:27
Русские шрифты в консоли
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.08.2012, 10:34
Два компилятора (MSVC и mingv) выдают одинаково: 12, 11.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
31.08.2012, 10:42
Dani, человек спросил почему Hello world имеет длину 12 а Привет мир имеет 20, а не как руссифицировать приложение
xtorne21st, ответ прост "Привет мир" состоит из 10 символов кирилицы (TCHAR) которые имеют размер 2 байта. Также хочу добавить что size(размер строки в байтах) и length(длина строки - число символов в ней) это два разных метода (хотя на char-ах они одинаковый результат дают)
Изображения
 
2
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
31.08.2012, 10:43
-=ЮрА=-, какой TCHAR в GNU C++ ??
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
31.08.2012, 10:45
Добавлено через 5 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Два компилятора (MSVC и mingv) выдают одинаково: 12, 11.
alsav22, ливвёркспэйс думает по другому
Цитата Сообщение от CheshireCat Посмотреть сообщение
-=ЮрА=-, какой TCHAR в GNU C++ ??
CheshireCat, на смотри
http://liveworkspace.org/code/... 6acdb0bb99
Код
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
  string line = "Привет мир!";
  cout << line.size()<<endl;
  return 0;
}

Отработка
Hide/Show
20
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
31.08.2012, 10:45
CheshireCat, ну он имел просто "широкие" (wide) символы, чего придираться то?
0
31.08.2012, 10:51

Не по теме:

CheshireCat, я поправлюсь

C++
1
wchar_t
вот этот тип

0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
31.08.2012, 10:56  [ТС]
Цитата Сообщение от nexen Посмотреть сообщение
CheshireCat, ну он имел просто "широкие" (wide) символы, чего придираться то?
Получается, во фразе "Привет Мир!" 9 символов кириллицы 2*9=18 один пробел и один восклицательный знак. Итого 20 - всё верно. Вот только что это за "широкие" символы пока не ясно. Если кто помнит где можно почитать об этом, ткните носом, будте добры.

Добавлено через 4 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
wchar_t
кириллица принадлежит unicode, который имеет тип wchar_t (2 байта) и поэтому size() вычисляет это как 2 символа, верно?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
31.08.2012, 10:57
Цитата Сообщение от xtorne21st Посмотреть сообщение
Вот только что это за "широкие" символы пока не ясно. Если кто помнит где можно почитать об этом, ткните носом, будте добры.
- я выше написал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
wchar_t
- почитай об этом типе
http://ru.wikipedia.org/wiki/Широкий_символ
1
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
31.08.2012, 11:13  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- почитай об этом типе
http://ru.wikipedia.org/wiki/Широкий_символ
Тут сказано, что не все символы входят в unicode - 2 байта, а те которые не входят кодируются как пара wchar_t - 4 байта. Но так как компилятор GNU C++ считает кириллицу как за 2 байта, то можно предположить, что кириллица входит в состав unicode. Верно ли моё предположение? Кто в курсе будте добры, ответите.

Добавлено через 6 минут
Всем спасибо. Ответ нашёл здесь:
http://ru.wikipedia.org/wiki/Кириллица_в_Юникоде
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
31.08.2012, 11:22
xtorne21st, там сказано что размер wchar_t определяется компилятором и может быть равен 8 битам (как у обычного символа). По увиденным мною отработкам заключаю, что GNU отводит под него 2 байта(я использую MSVS у которого "привет мир!" выдаёт 11 символов и об особенностях GNU могу лишь догадываться по тому что вижу на форуме)

«размер типа wchar_t определяется компилятором, вплоть до минимальных 8 бит. Соответственно, приложения, которым требуется сохранять переносимость на различных C и C++ компиляторах, не должны использовать wchar_t для хранения Unicode-текста. Тип wchar_t предназначен для хранения широких символов в том виде, в котором их понимают конкретные компиляторы, и это может не соответствовать Юникоду».
- основываясь на этом заключу что
Привет мир!
9-широких символов для букв + пробел + ! компилятор GNU втиснул в 20 байт по след принципу 9*2 = 18 + 1 на пробел + 1 на восклицательный знак

Не выхватывайте отдельные фразы из контекста тогда будет понятней

Добавлено через 4 минуты

Не по теме:

Хммм вижу что с length и szie дал маху и спутал с чем то другим
http://www.cplusplus.com/refer... ng/length/

size_t length() const;
Return length of string
Returns a count of the number of characters in the string.

string::length is an alias of string::size, returning both the exact same value.
Т.о size и length идентичные методы - тут я сфэйлил, прошу простить:(

0
31.08.2012, 11:37

Не по теме:

-=ЮрА=-,

ливвёркспэйс
это что?

0
31.08.2012, 11:43

Не по теме:

alsav22, liveworkspace.org

1
31.08.2012, 12:16

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
-=ЮрА=-,
ливвёркспэйс
это что?
- есть ещё кодпад - codpad.org (тоже онлайн компилятор)

1
7 / 7 / 2
Регистрация: 12.08.2012
Сообщений: 96
31.08.2012, 22:47
Хм...а у меня всё работает
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
31.08.2012, 22:56
Rusarch333, что значит все работает?Код в теме работает у всех,т.к он рабочий
0
7 / 7 / 2
Регистрация: 12.08.2012
Сообщений: 96
31.08.2012, 23:05
(Правильно работает), правильно отображает кол-во символов.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
01.09.2012, 10:01
Цитата Сообщение от Rusarch333 Посмотреть сообщение
(Правильно работает), правильно отображает кол-во символов.
- напишите ваш компилятор, число символов возвращаемое size (вы читали это
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
(я использую MSVS у которого "привет мир!" выдаёт 11 символов и об особенностях GNU могу лишь догадываться по тому что вижу на форуме)
)

На счёт правиьности - вот вам два онлайн компилятора (на которые полфорума ровняется)
liveworkspace.org
codpad.org
скопипастте туда этот код
http://liveworkspace.org/code/... 6acdb0bb99
И поймите в чём проблемма (те онлайн компиляторы как бы эталон, тобишь если у вас работает по другому значит немного не по стандарту, если же вы пишите как и я в MSVS то привыкайте что в вас будут швырять камни и помидоры здесь на форуме, т.к. местный народ не хочет признавать студию как одну из лучших сред разработки приложений с высокоуровневым интерфейсом)
На счёт слов
Цитата Сообщение от Rusarch333 Посмотреть сообщение
Правильно работает
, гы у меня студия тоже иногда отрабатывает там где многие ломают голову, но это факт того что она (студия) работает с небольшими (облегчающими жизнь программисту) отклонениями от стандарта.
Надесь теперь вы понмаете что правильно (тобишь работает у меня) совсем не значит что в компиляторе блюдущему стандарт оно работает также(в этом то и была проблемма, а не в том работает/не работает ли код)
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.09.2012, 11:10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
xtorne21st, там сказано что размер wchar_t определяется компилятором и может быть равен 8 битам (как у обычного символа). По увиденным мною отработкам заключаю, что GNU отводит под него 2 байта(я использую MSVS у которого "привет мир!" выдаёт 11 символов и об особенностях GNU могу лишь догадываться по тому что вижу на форуме)
Опять ошибаешься. Во-первых, в GCC (под Linux) размер wchar_t обычно равен 4. В этом можно убедиться посмотрев на вывод sizeof(wchar_t). В MinGW и MSVS (то есть в Windows) размер wchar_t традиционно равен 2.
Во-вторых, в твоём примере wchar_t вообще не используется, а используется обычный char. А длина 20 получается из-за того, что строки представлены в кодировке UTF-8 с переменной длинной символов. Дальше угадал — кириллица представляется 2 байтами, ASCII символы одним. Если бы использовался wchar_t, то размер строки L"Привет мир!" был бы равен 10 (не считая нулевого символа в конце).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.09.2012, 11:10
Помогаю со студенческими работами здесь

Приведение типов string.size() к (void*)
Добрый день помогите пожалуста записать значение возвращаемое string.size() в фаил FILE * fp; fp =...

Корректно ли? string nonVowel = new char[str.size()];
При определение строки можно ли её инициализировать выделением памяти, что бы её потом переинициализировать? А как её тогда удалить? ...

String.size() длина русского слова в 2 раза больше, чем английского
Теоритическая причина этого понятна, не понятно, что делать. Как сделать так чтобы string.size() выдавал одинаковое число на слова ver и...

override функции стандартного класса
Хочу переписать функцию класса DataGridView как?) в C# 2 дня, не ругайте нашел как проснаследовать новый класс и переписать в новом...

Создание класса на основе стандартного
Здравствуйте, новичок в программировании пытаюсь разобраться с классами. Цель создать класс на основе класса PictureBox, задать там...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru