Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.88
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

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

31.08.2012, 10:20. Просмотров 6071. Ответов 40
Метки нет (Все метки)

Добрый день. При поптыке посчитать количество символов в введённой строке на латыне - отображает верный результат, а кириллицу читает неправильно. Компилятор 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2012, 10:20
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция size() стандартного класса string (C++):

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

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

Приведение типов string.size() к (void*) - C++
Добрый день помогите пожалуста записать значение возвращаемое string.size() в фаил FILE * fp; fp = fopen(&quot;C:\\T01.txt&quot;,&quot;rb&quot;); ...

Что возвращает функция size()? - C++
что выполняет функция size() не могу найти кто знает скажите плиз

Заменить поле класса со стандартного типа на пользовательский - C++
Я написал класс kartoteka: typedef unsigned int uint; struct str { char *name; char *number; uint time; uint...

Функция стандартного нормального отклонения (аналог NORMSDIST из Excel) - C++
Добрый день. Хочу написать функцию, которая работает подобно НОРМСТРАСП в Excel, т.е. возвращает функцию стандартного интегрального...

40
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 20:19 #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
0
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
01.09.2012, 20:22 #32
Твои личные заблуждения меня не беспокоят. Это твои проблемы. Мне не нравится лишь то, что ты навязываешь свои заблуждения другим.
Я попросил цитату, где я говорил, что размер чар 2 байта.
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 20:28 #33
Цитата Сообщение от grizlik78 Посмотреть сообщение
Я попросил цитату, где я говорил, что размер чар 2 байта.
- ты чё чувак слепой?
Цитата Сообщение от grizlik78 Посмотреть сообщение
Во-вторых, в твоём примере wchar_t вообще не используется, а используется обычный char. А длина 20 получается из-за того, что строки представлены в кодировке UTF-8 с переменной длинной символов.
Ты написал Юра - у тебя переменная длинна символов, тобишь в std::string (которая чарами оперирует) у тебя чары были по 2 байта. И вообще перечитай верхний пост...

Не по теме:

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



Добавлено через 2 минуты
Итак grizlik78, отделяем мух от котлет : Как ты сказал в нашей строке "Привет мир!" переменная длинна символов, какой тип говоришь там использован, а то как то ты начинаешь выворачивать и туда и сюда, итак какой тип использовался в примере ТС?Пишем пишем
0
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
01.09.2012, 20:35 #34
В твоём стринге было 20 чаров размером по 1 байту каждый. Что непонятно? Девять букв занимали 18 чаров, плюс по одному чару на пробел и восклицательный знак.

Добавлено через 6 минут
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
итак какой тип использовался в примере ТС?
char, разумеется.
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 20:37 #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
0
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
01.09.2012, 20:43 #36
Ну, попробую ещё раз. В линуксе (на котором codepad и liveworkspace) для представления символов, чаще всего, используется кодировка UTF-8. Эта кодировка разные буквы кодирует разным количеством байтов. А уже эти байты составляют строку в виде последовательности чаров, при этом на одну букву может требоваться и 2 и 3 и даже 4 байта, то есть буква может занимать от одного до 4 чаров. В Windows в консоли традиционно используются однобайтовые кодировки, в которых одна буква — один чар. Поэтому число чаров, которое выдаёт string.size(), может совпадать, а может и не совпадать с количеством букв. Здесь под буквами я подразумеваю и знаки препинания, и другие символы, просто чтобы не путать с char.
0
alsav22
5436 / 4831 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.09.2012, 21:09 #37
Цитата Сообщение от grizlik78 Посмотреть сообщение
Поэтому число чаров, которое выдаёт string.size()
string.size() выдаёт количество чаров, а wstring.size()? Количество wchar_t ?
0
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
01.09.2012, 21:13 #38
Цитата Сообщение от alsav22 Посмотреть сообщение
string.size() выдаёт количество чаров, а wstring.size()? Количество wchar_t ?
Да, так.
1
alsav22
5436 / 4831 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.09.2012, 21:18 #39
Ещё вопрос. Что за размер самого объекта string выдаёт codepad: 4 (sizeof(string), sizeof(wstring))? MSVC и mingv выдают 32.
0
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
01.09.2012, 21:35 #40
Цитата Сообщение от alsav22 Посмотреть сообщение
Что за размер самого объекта string выдаёт codepad: 4 (sizeof(string), sizeof(wstring))?
Надо смотреть реализацию. Возможно там используется идиома pimpl, тогда это размер указателя на реализацию.

Добавлено через 13 минут
Посмотрел. В общем-то pimpl там нет, но из не статических членов-данных там действительно хранится только указатель на структуру, с наследованием от аллокатора. В других реализациях, очевидно, в самом классе хранятся какие-то другие данные. Это внутреннее дело этих реализаций.
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.09.2012, 09:47 #41
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Тогда я не могу почему в студии вот такой расклад
Юра, позволь я завершу ваш с Грызликом спор.
По неизвестной мне причине, кодпад автоматически сохраняет строку в мультибайте (русские символы там по два байта получаются как раз) и при компиляции так же использует мультибайт. Студия этого не делает (совершенно правильно поступает при этом).
Если вручную повторить перевод юникодовской строки в мультибайт, то результат студии совпадает с кодпадом.
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2012, 09:47
Привет! Вот еще темы с ответами:

Заполнить квадратную матрицу змейкой по диагонали, начиная с элемента matrix[size-1][size-1] - C++
Требуется написать программу, которая заполняет массив размерности n*n по заданному правилу: 25 23 22 16 15 24 ...

Как сделать, чтобы функция класса могла работать с обьектами другого класса - C++
есть класс к примеру class One и класс к примеру class Two нужно чтобы элемент функция класса One могла работать в обьектами класа...

Сам вопрос: почему функция-член одного класса не вызывается из функции-члена другого класса? - C++
//Щас всё объясню. Так, имеем два класса, в одном я определил функцию-член. Все конструкторы и прочее //опущены для уменьшения кода ...

Перегрузка операций: friend-функция или функция-член класса - C++
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и friend. Вот к примеру такой код. class...


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

Или воспользуйтесь поиском по форуму:
41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru