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

Стандартное определение длины строки в С++ - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 186, средняя оценка - 4.61
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.05.2009, 19:41     Стандартное определение длины строки в С++ #1
Есть такой массив:
C++
1
char massive[]="что-то там"
Нужна функция из стандарта С++ для определения длины строки.Почему sizeof(massive)==19?На моём компьютере русские символы занимают два байта+1 байт на пробел?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2009, 19:41     Стандартное определение длины строки в С++
Посмотрите здесь:

C++ Определение длины подпоследовательности
Определение длины файла в С C++
Текстовый файл содержит строки – предложения разной длины. Записать их в выходной файл в порядке возрастания длины строки C++
Текстовый файл содержит строки – предложения разной длины. Записать их в выходной файл в порядке возрастания длины строки C++
C++ Ошибки (в файле содержатся строки разной длины - записать их в выходной файл в порядке возрастания длины строки)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
08.05.2009, 22:59     Стандартное определение длины строки в С++ #21
Цитата Сообщение от #pragma Посмотреть сообщение
Тогда почему
C++
1
sizeof("Я")==3
??
Потому что это в юникоде

Давай немного поясню. Когда ты делаешь инициализацию массива без указания длины, то его размер становится равным длине указателя

C
1
int a[] = { 1, 2, 3 }; // a иницилиалируется тремя элементами
Точно так же, когда ты инициализируешь char[]. На месте статического инициализатора строка в кавычках трактуется как массив байтов с нулевым завершающим симолом

C
1
char a[]="abc"; // эквивалентно char a[] = { 'a', 'b', 'c', '\0' }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
08.05.2009, 23:04     Стандартное определение длины строки в С++ #22
Цитата Сообщение от Evg Посмотреть сообщение
Потому что это в юникоде
Должно быть 4.
C++
1
2
cout<<sizeof(L'Я')<<endl;//2
cout<<sizeof(L"Я")<<endl;//4
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
08.05.2009, 23:15     Стандартное определение длины строки в С++ #23
Хм... там и на ноль два байта уходит?
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.05.2009, 23:15  [ТС]     Стандартное определение длины строки в С++ #24
Evg, а что такое длина указателя?размер занимаемой памяти? Это только у меня в системе так?То есть в моей системе длина указателя на символ в юникоде(а "Я" вюникоде) занимает 2 байта,и поэтому размер массива удваивается?

"Вы отправили слишком большое кол-во отзывов за 24 часа"
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
08.05.2009, 23:16     Стандартное определение длины строки в С++ #25
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
sizeof("Я")==3
Внимательно читаем то, что написано жирным:

The ASCII character set defines characters in the range 0x00 – 0x7F. There are a number of other character sets, primarily European, that define the characters within the range 0x00 – 0x7F identically to the ASCII character set and also define an extended character set from 0x80 – 0xFF. Thus an 8-bit, single-byte-character set (SBCS) is sufficient to represent the ASCII character set as well as the character sets for many European languages. However, some non-European character sets, such as Japanese Kanji, include many more characters than can be represented in a single-byte coding scheme, and therefore require multibyte-character set (MBCS) encoding.

Note
Many SBCS routines in the Microsoft run-time library handle multibyte bytes, characters, and strings as appropriate. Many multibyte-character sets define the ASCII character set as a subset. In many multibyte character sets, each character in the range 0x00 – 0x7F is identical to the character that has the same value in the ASCII character set. For example, in both ASCII and MBCS character strings, the one-byte NULL character ('\0') has value 0x00 and indicates the terminating null character.


A multibyte character set may consist of both one-byte and two-byte characters. Thus a multibyte-character string may contain a mixture of single-byte and double-byte characters. A two-byte multibyte character has a lead byte and a trail byte. In a particular multibyte-character set, the lead bytes fall within a certain range, as do the trail bytes. When these ranges overlap, it may be necessary to evaluate the particular context to determine whether a given byte is functioning as a lead byte or a trail byte.

Иными словами в вашем случае
"Я" - является MBCS(не путайте с Unicode) строкой, где символ 'Я' - занимает 2 байта, а символ '0' - один байт.
Alexiski
Любитель давать советы
 Аватар для Alexiski
338 / 130 / 2
Регистрация: 12.01.2009
Сообщений: 511
08.05.2009, 23:20     Стандартное определение длины строки в С++ #26
Скорее всего, строка в UTF-8. Тогда так и будет. Переменная длина символа.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.05.2009, 23:35  [ТС]     Стандартное определение длины строки в С++ #27
Всем огромное спасибо,это был очень полезный для меня вопрос.Выходит,от кириллицы пока придётся отказатся вообще... программы с 'я' не компилятся вообще,и я не вижу решения.Если у кого-то есть,милости просим)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
08.05.2009, 23:38     Стандартное определение длины строки в С++ #28
Цитата Сообщение от #pragma Посмотреть сообщение
Evg, а что такое длина указателя?размер занимаемой памяти? Это только у меня в системе так?То есть в моей системе длина указателя на символ в юникоде(а "Я" вюникоде) занимает 2 байта,и поэтому размер массива удваивается?
Длина указателя - такого термина вроде бы и нет. Ты скажи конкретнее, в каком контексте ты это видел/слышал/читал

Про символ "Я" - не указатель, а сам символ занимает два байта

Т.е. строка "Я" представляется как 3 байта: { xx, yy, 0 }, где xx и yy - кодировка символя "Я" в юникоде (или как там оно, я не совсем в этих кодировках понимаю)
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.05.2009, 23:41  [ТС]     Стандартное определение длины строки в С++ #29
Цитата Сообщение от Evg Посмотреть сообщение
Потому что это в юникоде

Давай немного поясню. Когда ты делаешь инициализацию массива без указания длины, то его размер становится равным длине указателя
Вот здесь
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
08.05.2009, 23:48     Стандартное определение длины строки в С++ #30
Цитата Сообщение от #pragma Посмотреть сообщение
Всем огромное спасибо,это был очень полезный для меня вопрос.Выходит,от кириллицы пока придётся отказатся вообще... программы с 'я' не компилятся вообще,и я не вижу решения.Если у кого-то есть,милости просим)
Попробуй сделать следующее.
В начале исходника вставь:
C++
1
#define _UNICODE
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.05.2009, 23:59  [ТС]     Стандартное определение длины строки в С++ #31
Не помогает.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
09.05.2009, 00:14     Стандартное определение длины строки в С++ #32
Цитата Сообщение от #pragma Посмотреть сообщение
Вот здесь
Пардон, не "длине указателя", а "длине инициализатора". Что-то у меня уже пальцы заплетаются...
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
09.05.2009, 00:26  [ТС]     Стандартное определение длины строки в С++ #33
Цитата Сообщение от ISergey Посмотреть сообщение
Должно быть 4.
C++
1
2
cout<<sizeof(L'Я')<<endl;//2
cout<<sizeof(L"Я")<<endl;//4
C++
1
2
std::cout<<sizeof(L'Я')<<std::endl;//==4!
std::cout<<sizeof(L"Я")<<std::endl;//==8!
Но это просто особенности моего компа,ничего не должно,так как на разных компах же по-разному,а разве это то же самое: L"Я" и "Я"?
Alexiski
Любитель давать советы
 Аватар для Alexiski
338 / 130 / 2
Регистрация: 12.01.2009
Сообщений: 511
09.05.2009, 00:41     Стандартное определение длины строки в С++ #34
Нет, не то же самое. L"Я" кодируется в wide-char, а они в Linux - ровно 4 байта
А просто "Я" - вероятно, в UTF-8 - переменный размер символа от 1 байта.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
09.05.2009, 16:18     Стандартное определение длины строки в С++ #35
Цитата Сообщение от #pragma Посмотреть сообщение
Тогда почему Код C++1
sizeof("Я")==3??
может у тебя компилятор кирилицу как Unicode воспринимает
Spaum145
 Аватар для Spaum145
2 / 2 / 0
Регистрация: 23.08.2009
Сообщений: 21
02.06.2011, 14:06     Стандартное определение длины строки в С++ #36
В двойных кавычках передался в функцию не символ, а его числовое значение, код символа
Artemeey
0 / 0 / 1
Регистрация: 15.09.2013
Сообщений: 6
15.09.2013, 18:07     Стандартное определение длины строки в С++ #37
На самом деле:
1) 'a' - это символ
2) "a" - это строка, в памяти хранится как 2 символа: 'a' и '\0'
3) В добавок ко всему этому кодировка. Однако при просчете кодировки, не забывайте о последнем символе - символе конца строки '\0'.
Croessmah
15.09.2013, 18:27
  #38

Не по теме:

Два года тишины и вдруг просветление...

Artemeey
0 / 0 / 1
Регистрация: 15.09.2013
Сообщений: 6
15.09.2013, 18:30     Стандартное определение длины строки в С++ #39
Лучше поздно чем никогда, верно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2013, 18:59     Стандартное определение длины строки в С++
Еще ссылки по теме:

C++ Определение длины заранее неопределенной строки
C++ Какие методы класса fstream отвечают за определение количества строк в файле и длины строки?
C++ Ввод строки, определение ее длины, и удаление в ней всех пробелов

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

Или воспользуйтесь поиском по форуму:
Croessmah
15.09.2013, 18:59     Стандартное определение длины строки в С++
  #40

Не по теме:

Цитата Сообщение от Artemeey Посмотреть сообщение
Лучше поздно чем никогда, верно?
смотря о чем речь

Yandex
Объявления
15.09.2013, 18:59     Стандартное определение длины строки в С++
Ответ Создать тему
Опции темы

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