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

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

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

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

31.08.2012, 10:20. Просмотров 5209. Ответов 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, т.е. возвращает функцию стандартного интегрального...

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

На счёт правиьности - вот вам два онлайн компилятора (на которые полфорума ровняется)
liveworkspace.org
codpad.org
скопипастте туда этот код
http://liveworkspace.org/code/a08d11...488e6acdb0bb99
И поймите в чём проблемма (те онлайн компиляторы как бы эталон, тобишь если у вас работает по другому значит немного не по стандарту, если же вы пишите как и я в MSVS то привыкайте что в вас будут швырять камни и помидоры здесь на форуме, т.к. местный народ не хочет признавать студию как одну из лучших сред разработки приложений с высокоуровневым интерфейсом)
На счёт слов
Цитата Сообщение от Rusarch333 Посмотреть сообщение
Правильно работает
, гы у меня студия тоже иногда отрабатывает там где многие ломают голову, но это факт того что она (студия) работает с небольшими (облегчающими жизнь программисту) отклонениями от стандарта.
Надесь теперь вы понмаете что правильно (тобишь работает у меня) совсем не значит что в компиляторе блюдущему стандарт оно работает также(в этом то и была проблемма, а не в том работает/не работает ли код)
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
01.09.2012, 11:10 #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 (не считая нулевого символа в конце).
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 11:51 #21
grizlik78, почитай вики на счет переменого размера вчар,а также вспони зачем для структур используют прагма пак(это я к тому что пробел и знак восклицания идя в юникодной строке влезли в 2 байта вместо 4-х).И да если не вчар использовался для юникода,то какой-такой тип,ммм???)))Ответ обязателен!
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
01.09.2012, 11:58 #22
Не путай тип переменной (char, wchar_t), набор символов Unicode и кодировку символов (CP1251, UTF-8, USC2, UTF-16LE и т. д., тысячи их).
В твоём примере используется тип char, набор символов Unicode и кодировка UTF-8.
В пределах одного компилятора размер wchar_t не меняется. Он может измениться только при смене платформы (компилятор или ОС).
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.09.2012, 12:54 #23
codepad
0
Миниатюры
Функция size() стандартного класса string  
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 14:12 #24
Цитата Сообщение от grizlik78 Посмотреть сообщение
В твоём примере используется тип char, набор символов Unicode и кодировка UTF-8.
смотри кодпад
http://codepad.org/XDTlhPh9
Внизу скрин этого же для студии. Размер чара увидел? (1 при юникоде).
Ты говоришь, что чар в гну при юникоде 2 байта ну так ведь?
Я даже далее пошёл - вывел в sizeof(line[0]) http://codepad.org/MD58BonG ОПА ДА?=)
Теперь давай мне ответь, почему при включенном юникоде, что окна что гну кодпада показывает чар 1 байт?Ну давай раз уж завелись найдём истину! Жду пояснений...

Не по теме:


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

1
Миниатюры
Функция size() стандартного класса string  
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
01.09.2012, 16:33 #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 ко всему этому отношения не имеет.
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 16:49 #26
grizlik78, тогда объясни как хранилось Привет мир! std::string которая являет собой char - овский контейнер и как объяснишь тот факт что П line[0] занимало 1 байт?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Контейнер что сам собой изменил тип своего содержания?
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
01.09.2012, 18:26 #27
http://codepad.org/So2S3hNv
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Контейнер что сам собой изменил тип своего содержания?
Нет конечно. Известно же, что std::string оперирует типом char. Чтобы в строке был wchar_t надо использовать wstring.
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 19:32 #28
grizlik78, подогоди,пару постов назад ты сказал, что гну использовал юникод в котором размер чара равен 2 байта, а теперь пишешь, что в стринге чары по 1 байт. Попахивает твоим фэйлом, не находишь?
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
01.09.2012, 19:34 #29
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
подогоди,пару постов назад ты сказал, что гну использовал юникод в котором размер чара равен 2 байта
Цитату давай. Я такого никогда не говорил. Размер char всегда 1 байт.
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.09.2012, 20:16 #30
Цитата Сообщение от grizlik78 Посмотреть сообщение
Цитату давай. Я такого никогда не говорил. Размер char всегда 1 байт.
Да пожалуйста
Цитата Сообщение от grizlik78 Посмотреть сообщение
Не путай тип переменной (char, wchar_t), набор символов Unicode и кодировку символов (CP1251, UTF-8, USC2, UTF-16LE и т. д., тысячи их).
В твоём примере используется тип char, набор символов Unicode и кодировка UTF-8.
В пределах одного компилятора размер wchar_t не меняется. Он может измениться только при смене платформы (компилятор или ОС).
А теперь дружище посмотри скриншот и наверное иди в другой топик, батл ты проиграл, да ещё и сфейлил
0
Миниатюры
Функция size() стандартного класса string  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2012, 20: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...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.09.2012, 20:16
Ответ Создать тему
Опции темы

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