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

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

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

Author24 — интернет-сервис помощи студентам
Добрый день. При поптыке посчитать количество символов в введённой строке на латыне - отображает верный результат, а кириллицу читает неправильно. Компилятор 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2012, 10:20
Ответы с готовыми решениями:

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

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

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

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

42
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.09.2012, 09:47 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Тогда я не могу почему в студии вот такой расклад
Юра, позволь я завершу ваш с Грызликом спор.
По неизвестной мне причине, кодпад автоматически сохраняет строку в мультибайте (русские символы там по два байта получаются как раз) и при компиляции так же использует мультибайт. Студия этого не делает (совершенно правильно поступает при этом).
Если вручную повторить перевод юникодовской строки в мультибайт, то результат студии совпадает с кодпадом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
#include <iostream>
#include <Windows.h>
using namespace std;
 
 
int main(int argc, char* argv[])
{
    wchar_t rus[] = L"Привет мир!";
    char utf8[256] = {0};
 
    DWORD result = ::WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, rus, -1, utf8, 255, 0, 0 );
 
    DWORD err = GetLastError();
 
    string line = utf8;
    for(int i = 0; i < (int)line.size(); i++)
        cout<<i<<" - "<<(int)line[i]<<endl;
 
    cin.get();
    return 0;
}
0
0 / 0 / 0
Регистрация: 18.08.2019
Сообщений: 2
14.01.2022, 20:42 42
Возможно будет не актуально,символы кириллицы находятся в unicode-таблице, и один символ из этой таблицы занимает 2 байта.Вот ссылка на статью, с картинками https://docs.microsoft.com/ru-... w=msvc-170
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
14.01.2022, 22:19 43
Излагаем еще проще. То что описывается в таблицах юникода, это code point-ы. То что у вас в string-ах лежит и подсчитывается методом size(), это code unit-ы. В зависимости от кодировки (utf-8/utf-16/-utf-32), одному код-поинту может соответствовать и один код-юнит, и три. И к исходному тексту эти код-юниты имеют примерно такое же отношение, как zip-архив к исходному файлу. А то что конечный пользователь называет "символом", это строго говоря grapheme cluster, который может собираться из неопределенного количества code point. Но в большинстве случаев все же состоит из одного код поинта. И те же регулярки существование этих самых кластеров обычно не учитывают.
0
14.01.2022, 22:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2022, 22:19
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
43
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru