Форум программистов, компьютерный форум 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2012, 10:20     Функция size() стандартного класса string
Посмотрите здесь:

C++ Функция ввода для класса string
C++ Приведение типов string.size() к (void*)
C++ Сам вопрос: почему функция-член одного класса не вызывается из функции-члена другого класса?
В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО! C++
C++ Что возвращает функция size()?
Как сделать, чтобы функция класса могла работать с обьектами другого класса C++
C++ Функция стандартного нормального отклонения (аналог NORMSDIST из Excel)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 11:51     Функция size() стандартного класса string #21
grizlik78, почитай вики на счет переменого размера вчар,а также вспони зачем для структур используют прагма пак(это я к тому что пробел и знак восклицания идя в юникодной строке влезли в 2 байта вместо 4-х).И да если не вчар использовался для юникода,то какой-такой тип,ммм???)))Ответ обязателен!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
01.09.2012, 11:58     Функция size() стандартного класса string #22
Не путай тип переменной (char, wchar_t), набор символов Unicode и кодировку символов (CP1251, UTF-8, USC2, UTF-16LE и т. д., тысячи их).
В твоём примере используется тип char, набор символов Unicode и кодировка UTF-8.
В пределах одного компилятора размер wchar_t не меняется. Он может измениться только при смене платформы (компилятор или ОС).
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.09.2012, 12:54     Функция size() стандартного класса string #23
codepad
Миниатюры
Функция size() стандартного класса string  
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 14:12     Функция size() стандартного класса string #24
Цитата Сообщение от grizlik78 Посмотреть сообщение
В твоём примере используется тип char, набор символов Unicode и кодировка UTF-8.
смотри кодпад
http://codepad.org/XDTlhPh9
Внизу скрин этого же для студии. Размер чара увидел? (1 при юникоде).
Ты говоришь, что чар в гну при юникоде 2 байта ну так ведь?
Я даже далее пошёл - вывел в sizeof(line[0]) http://codepad.org/MD58BonG ОПА ДА?=)
Теперь давай мне ответь, почему при включенном юникоде, что окна что гну кодпада показывает чар 1 байт?Ну давай раз уж завелись найдём истину! Жду пояснений...

Не по теме:


PS:alsav22, тебе совсем не обязательно аттачить скриншотом отработку, вверху кодпада идёт надпись Link: вот то что после неё выводит на твой код (экономь себе силы)

Миниатюры
Функция size() стандартного класса string  
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
01.09.2012, 16:33     Функция size() стандартного класса string #25
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ты говоришь, что чар в гну при юникоде 2 байта ну так ведь?
char всегда 1 байт. wchar_t на разных платформах имеет разный размер. Но размер переменной не зависит от использования Юникода, а тем более от макроса UNICODE.
А вот представление строки текста в памяти зависит от кодировки. При использовании UTF-8 один кириллический символ представляется двумя элементами типа char, то есть двумя байтами. Латинские символы при этом помещаются в одном char. При использовании же wchar_t и те и другие занимают в линуксе 4 байта (но один элемент массива), поскольку там используется UTF-32 (или UCS-4). В Windows размер wchar_t имеет размер 2 байта и поэтому там используется UTF-16, при этом и латинские и кириллические символы занимают по 2 байта (но по прежнему это один элемент wchar_t). И только некоторые из символов Unicode представляются суррогатными парами, то есть по 2 элемента wchar_t.
Макрос UNICODE ко всему этому отношения не имеет.
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 16:49     Функция size() стандартного класса string #26
grizlik78, тогда объясни как хранилось Привет мир! std::string которая являет собой char - овский контейнер и как объяснишь тот факт что П line[0] занимало 1 байт?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Контейнер что сам собой изменил тип своего содержания?
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
01.09.2012, 18:26     Функция size() стандартного класса string #27
http://codepad.org/So2S3hNv
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Контейнер что сам собой изменил тип своего содержания?
Нет конечно. Известно же, что std::string оперирует типом char. Чтобы в строке был wchar_t надо использовать wstring.
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 19:32     Функция size() стандартного класса string #28
grizlik78, подогоди,пару постов назад ты сказал, что гну использовал юникод в котором размер чара равен 2 байта, а теперь пишешь, что в стринге чары по 1 байт. Попахивает твоим фэйлом, не находишь?
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
01.09.2012, 19:34     Функция size() стандартного класса string #29
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
подогоди,пару постов назад ты сказал, что гну использовал юникод в котором размер чара равен 2 байта
Цитату давай. Я такого никогда не говорил. Размер char всегда 1 байт.
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 20:16     Функция size() стандартного класса string #30
Цитата Сообщение от grizlik78 Посмотреть сообщение
Цитату давай. Я такого никогда не говорил. Размер char всегда 1 байт.
Да пожалуйста
Цитата Сообщение от grizlik78 Посмотреть сообщение
Не путай тип переменной (char, wchar_t), набор символов Unicode и кодировку символов (CP1251, UTF-8, USC2, UTF-16LE и т. д., тысячи их).
В твоём примере используется тип char, набор символов Unicode и кодировка UTF-8.
В пределах одного компилятора размер wchar_t не меняется. Он может измениться только при смене платформы (компилятор или ОС).
А теперь дружище посмотри скриншот и наверное иди в другой топик, батл ты проиграл, да ещё и сфейлил
Миниатюры
Функция size() стандартного класса string  
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 20:19     Функция size() стандартного класса string #31
Цитата Сообщение от grizlik78 Посмотреть сообщение
Размер char всегда 1 байт.
а я и не спорил, я тебя к твоему же фэйлу плавненько подвёл:

Цитата Сообщение от grizlik78 Посмотреть сообщение
Во-вторых, в твоём примере wchar_t вообще не используется, а используется обычный char. А длина 20 получается из-за того, что строки представлены в кодировке UTF-8 с переменной длинной символов.
- чувак ты писал об обратном -
Цитата Сообщение от grizlik78 Посмотреть сообщение
Известно же, что std::string оперирует типом char.


Цитата Сообщение от grizlik78 Посмотреть сообщение
Дальше угадал — кириллица представляется 2 байтами, ASCII символы одним. Если бы использовался wchar_t, то размер строки L"Привет мир!" был бы равен 10 (не считая нулевого символа в конце).
- в винде и выдаётся 11 (и да в Привет Мир! - 11 символов)
Функция size() стандартного класса string
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
01.09.2012, 20:22     Функция size() стандартного класса string #32
Твои личные заблуждения меня не беспокоят. Это твои проблемы. Мне не нравится лишь то, что ты навязываешь свои заблуждения другим.
Я попросил цитату, где я говорил, что размер чар 2 байта.
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 20:28     Функция size() стандартного класса string #33
Цитата Сообщение от grizlik78 Посмотреть сообщение
Я попросил цитату, где я говорил, что размер чар 2 байта.
- ты чё чувак слепой?
Цитата Сообщение от grizlik78 Посмотреть сообщение
Во-вторых, в твоём примере wchar_t вообще не используется, а используется обычный char. А длина 20 получается из-за того, что строки представлены в кодировке UTF-8 с переменной длинной символов.
Ты написал Юра - у тебя переменная длинна символов, тобишь в std::string (которая чарами оперирует) у тебя чары были по 2 байта. И вообще перечитай верхний пост...

Не по теме:

Твои логические выкладки мне тоже как бы к 5-й точке



Добавлено через 2 минуты
Итак grizlik78, отделяем мух от котлет : Как ты сказал в нашей строке "Привет мир!" переменная длинна символов, какой тип говоришь там использован, а то как то ты начинаешь выворачивать и туда и сюда, итак какой тип использовался в примере ТС?Пишем пишем
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
01.09.2012, 20:35     Функция size() стандартного класса string #34
В твоём стринге было 20 чаров размером по 1 байту каждый. Что непонятно? Девять букв занимали 18 чаров, плюс по одному чару на пробел и восклицательный знак.

Добавлено через 6 минут
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
итак какой тип использовался в примере ТС?
char, разумеется.
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 20:37     Функция size() стандартного класса string #35
Т.е. вот так http://codepad.org/MdBrR4cj
Отработка
0 - -48
1 - -97
2 - -47
3 - -128
4 - -48
5 - -72
6 - -48
7 - -78
8 - -48
9 - -75
10 - -47
11 - -126
12 - 32
13 - -48
14 - -68
15 - -48
16 - -72
17 - -47
18 - -128
19 - 33
Тогда я не могу почему в студии вот такой расклад
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <string>
#include <iostream>
using namespace std;
 
 
int main(int argc, char* argv[])
{
    string line = "Привет мир!";
    for(int i = 0; i < (int)line.size(); i++)
            cout<<i<<" - "<<(int)line[i]<<endl;
    return 0;
}
0 - -49
1 - -16
2 - -24
3 - -30
4 - -27
5 - -14
6 - 32
7 - -20
8 - -24
9 - -16
10 - 33
Press any key to continue
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
01.09.2012, 20:43     Функция size() стандартного класса string #36
Ну, попробую ещё раз. В линуксе (на котором codepad и liveworkspace) для представления символов, чаще всего, используется кодировка UTF-8. Эта кодировка разные буквы кодирует разным количеством байтов. А уже эти байты составляют строку в виде последовательности чаров, при этом на одну букву может требоваться и 2 и 3 и даже 4 байта, то есть буква может занимать от одного до 4 чаров. В Windows в консоли традиционно используются однобайтовые кодировки, в которых одна буква — один чар. Поэтому число чаров, которое выдаёт string.size(), может совпадать, а может и не совпадать с количеством букв. Здесь под буквами я подразумеваю и знаки препинания, и другие символы, просто чтобы не путать с char.
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.09.2012, 21:09     Функция size() стандартного класса string #37
Цитата Сообщение от grizlik78 Посмотреть сообщение
Поэтому число чаров, которое выдаёт string.size()
string.size() выдаёт количество чаров, а wstring.size()? Количество wchar_t ?
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
01.09.2012, 21:13     Функция size() стандартного класса string #38
Цитата Сообщение от alsav22 Посмотреть сообщение
string.size() выдаёт количество чаров, а wstring.size()? Количество wchar_t ?
Да, так.
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.09.2012, 21:18     Функция size() стандартного класса string #39
Ещё вопрос. Что за размер самого объекта string выдаёт codepad: 4 (sizeof(string), sizeof(wstring))? MSVC и mingv выдают 32.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2012, 21:35     Функция size() стандартного класса string
Еще ссылки по теме:

Функция isspace и тип string: Не существует подходящей функции преобразования из "std::string" в "int" C++
Заменить поле класса со стандартного типа на пользовательский C++
Перегрузка операций: friend-функция или функция-член класса C++
Заполнить квадратную матрицу змейкой по диагонали, начиная с элемента matrix[size-1][size-1] C++
Выход из цикла методом size() класса string C++

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
01.09.2012, 21:35     Функция size() стандартного класса string #40
Цитата Сообщение от alsav22 Посмотреть сообщение
Что за размер самого объекта string выдаёт codepad: 4 (sizeof(string), sizeof(wstring))?
Надо смотреть реализацию. Возможно там используется идиома pimpl, тогда это размер указателя на реализацию.

Добавлено через 13 минут
Посмотрел. В общем-то pimpl там нет, но из не статических членов-данных там действительно хранится только указатель на структуру, с наследованием от аллокатора. В других реализациях, очевидно, в самом классе хранятся какие-то другие данные. Это внутреннее дело этих реализаций.
Yandex
Объявления
01.09.2012, 21:35     Функция size() стандартного класса string
Ответ Создать тему
Опции темы

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