Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.88
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
31.08.2012, 10:20     Функция size() стандартного класса string #1
Добрый день. При поптыке посчитать количество символов в введённой строке на латыне - отображает верный результат, а кириллицу читает неправильно. Компилятор 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
31.08.2012, 10:27     Функция size() стандартного класса string #2
Русские шрифты в консоли
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.08.2012, 10:34     Функция size() стандартного класса string #3
Два компилятора (MSVC и mingv) выдают одинаково: 12, 11.
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2012, 10:42     Функция size() стандартного класса string #4
Dani, человек спросил почему Hello world имеет длину 12 а Привет мир имеет 20, а не как руссифицировать приложение
xtorne21st, ответ прост "Привет мир" состоит из 10 символов кирилицы (TCHAR) которые имеют размер 2 байта. Также хочу добавить что size(размер строки в байтах) и length(длина строки - число символов в ней) это два разных метода (хотя на char-ах они одинаковый результат дают)
Изображения
 
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
31.08.2012, 10:43     Функция size() стандартного класса string #5
-=ЮрА=-, какой TCHAR в GNU C++ ??
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2012, 10:45     Функция size() стандартного класса string #6
Добавлено через 5 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Два компилятора (MSVC и mingv) выдают одинаково: 12, 11.
alsav22, ливвёркспэйс думает по другому
Цитата Сообщение от CheshireCat Посмотреть сообщение
-=ЮрА=-, какой TCHAR в GNU C++ ??
CheshireCat, на смотри
http://liveworkspace.org/code/a08d11...488e6acdb0bb99
Код
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
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
31.08.2012, 10:45     Функция size() стандартного класса string #7
CheshireCat, ну он имел просто "широкие" (wide) символы, чего придираться то?
-=ЮрА=-
31.08.2012, 10:51
  #8

Не по теме:

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

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

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

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

Добавлено через 6 минут
Всем спасибо. Ответ нашёл здесь:
http://ru.wikipedia.org/wiki/Кириллица_в_Юникоде
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2012, 11:22     Функция size() стандартного класса string #12
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/reference/s...string/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 идентичные методы - тут я сфэйлил, прошу простить

alsav22
31.08.2012, 11:37
  #13

Не по теме:

-=ЮрА=-,

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

Dani
31.08.2012, 11:43
  #14

Не по теме:

alsav22, liveworkspace.org

-=ЮрА=-
31.08.2012, 12:16
  #15

Не по теме:

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

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

На счёт правиьности - вот вам два онлайн компилятора (на которые полфорума ровняется)
liveworkspace.org
codpad.org
скопипастте туда этот код
http://liveworkspace.org/code/a08d11...488e6acdb0bb99
И поймите в чём проблемма (те онлайн компиляторы как бы эталон, тобишь если у вас работает по другому значит немного не по стандарту, если же вы пишите как и я в MSVS то привыкайте что в вас будут швырять камни и помидоры здесь на форуме, т.к. местный народ не хочет признавать студию как одну из лучших сред разработки приложений с высокоуровневым интерфейсом)
На счёт слов
Цитата Сообщение от Rusarch333 Посмотреть сообщение
Правильно работает
, гы у меня студия тоже иногда отрабатывает там где многие ломают голову, но это факт того что она (студия) работает с небольшими (облегчающими жизнь программисту) отклонениями от стандарта.
Надесь теперь вы понмаете что правильно (тобишь работает у меня) совсем не значит что в компиляторе блюдущему стандарт оно работает также(в этом то и была проблемма, а не в том работает/не работает ли код)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2012, 11:10     Функция size() стандартного класса string
Еще ссылки по теме:

C++ Функция стандартного нормального отклонения (аналог NORMSDIST из Excel)
Функция isspace и тип string: Не существует подходящей функции преобразования из "std::string" в "int" C++
Заменить поле класса со стандартного типа на пользовательский C++

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
01.09.2012, 11:10     Функция size() стандартного класса string #20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
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 (не считая нулевого символа в конце).
Yandex
Объявления
01.09.2012, 11:10     Функция size() стандартного класса string
Ответ Создать тему
Опции темы

Текущее время: 20:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru