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

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

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

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

31.08.2012, 10:20. Просмотров 5405. Ответов 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
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
31.08.2012, 10:27 #2
Русские шрифты в консоли
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.08.2012, 10:34 #3
Два компилятора (MSVC и mingv) выдают одинаково: 12, 11.
0
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2012, 10:42 #4
Dani, человек спросил почему Hello world имеет длину 12 а Привет мир имеет 20, а не как руссифицировать приложение
xtorne21st, ответ прост "Привет мир" состоит из 10 символов кирилицы (TCHAR) которые имеют размер 2 байта. Также хочу добавить что size(размер строки в байтах) и length(длина строки - число символов в ней) это два разных метода (хотя на char-ах они одинаковый результат дают)
2
Изображения
 
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
31.08.2012, 10:43 #5
-=ЮрА=-, какой TCHAR в GNU C++ ??
0
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2012, 10:45 #6
Добавлено через 5 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Два компилятора (MSVC и mingv) выдают одинаково: 12, 11.
alsav22, ливвёркспэйс думает по другому
Цитата Сообщение от CheshireCat Посмотреть сообщение
-=ЮрА=-, какой TCHAR в GNU C++ ??
CheshireCat, на смотри
http://liveworkspace.org/code/a08d111035bc16b496488e6acdb0bb99
Код
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
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
31.08.2012, 10:45 #7
CheshireCat, ну он имел просто "широкие" (wide) символы, чего придираться то?
0
-=ЮрА=-
31.08.2012, 10:51
  #8

Не по теме:

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

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

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

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

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

0
alsav22
31.08.2012, 11:37
  #13

Не по теме:

-=ЮрА=-,

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

0
Dani
31.08.2012, 11:43
  #14

Не по теме:

alsav22, liveworkspace.org

1
-=ЮрА=-
31.08.2012, 12:16     Функция size() стандартного класса string
  #15

Не по теме:

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

1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2012, 12:16
Привет! Вот еще темы с ответами:

Заполнить квадратную матрицу змейкой по диагонали, начиная с элемента 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...


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

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

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