Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/147: Рейтинг темы: голосов - 147, средняя оценка - 4.95
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926

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

08.05.2009, 19:41. Показов 31290. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такой массив:
C++
1
char massive[]="что-то там"
Нужна функция из стандарта С++ для определения длины строки.Почему sizeof(massive)==19?На моём компьютере русские символы занимают два байта+1 байт на пробел?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.05.2009, 19:41
Ответы с готовыми решениями:

Определение длины той части строки s, которая не содержит символы из строки s1
Функция - StrCSpn(s,s1). Определение длины той части строки s, которая не со-держит символы из строки s1.

Определение длины строки
Вот у меня есть рабочий код , но мне сказали , что он не совсем корректный , что его нужно исправить :c Но что нужно исправить или...

Определение длины строки
Нужно написать функцию, определяющую длину подаваемой на вход строки без использования встроенных функций вроде strlen(). ...

43
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.05.2009, 22:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от #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' }
1
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
08.05.2009, 23:04
Цитата Сообщение от Evg Посмотреть сообщение
Потому что это в юникоде
Должно быть 4.
C++
1
2
cout<<sizeof(L'Я')<<endl;//2
cout<<sizeof(L"Я")<<endl;//4
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.05.2009, 23:15
Хм... там и на ноль два байта уходит?
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
08.05.2009, 23:15  [ТС]
Evg, а что такое длина указателя?размер занимаемой памяти? Это только у меня в системе так?То есть в моей системе длина указателя на символ в юникоде(а "Я" вюникоде) занимает 2 байта,и поэтому размер массива удваивается?

"Вы отправили слишком большое кол-во отзывов за 24 часа"
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
08.05.2009, 23:16
Лучший ответ Сообщение было отмечено как решение

Решение

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' - один байт.
3
Любитель давать советы
 Аватар для Alexiski
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
08.05.2009, 23:20
Скорее всего, строка в UTF-8. Тогда так и будет. Переменная длина символа.
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
08.05.2009, 23:35  [ТС]
Всем огромное спасибо,это был очень полезный для меня вопрос.Выходит,от кириллицы пока придётся отказатся вообще... программы с 'я' не компилятся вообще,и я не вижу решения.Если у кого-то есть,милости просим)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.05.2009, 23:38
Цитата Сообщение от #pragma Посмотреть сообщение
Evg, а что такое длина указателя?размер занимаемой памяти? Это только у меня в системе так?То есть в моей системе длина указателя на символ в юникоде(а "Я" вюникоде) занимает 2 байта,и поэтому размер массива удваивается?
Длина указателя - такого термина вроде бы и нет. Ты скажи конкретнее, в каком контексте ты это видел/слышал/читал

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

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

Давай немного поясню. Когда ты делаешь инициализацию массива без указания длины, то его размер становится равным длине указателя
Вот здесь
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
08.05.2009, 23:48
Цитата Сообщение от #pragma Посмотреть сообщение
Всем огромное спасибо,это был очень полезный для меня вопрос.Выходит,от кириллицы пока придётся отказатся вообще... программы с 'я' не компилятся вообще,и я не вижу решения.Если у кого-то есть,милости просим)
Попробуй сделать следующее.
В начале исходника вставь:
C++
1
#define _UNICODE
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
08.05.2009, 23:59  [ТС]
Не помогает.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.05.2009, 00:14
Цитата Сообщение от #pragma Посмотреть сообщение
Вот здесь
Пардон, не "длине указателя", а "длине инициализатора". Что-то у меня уже пальцы заплетаются...
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
09.05.2009, 00:26  [ТС]
Цитата Сообщение от 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"Я" и "Я"?
0
Любитель давать советы
 Аватар для Alexiski
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
09.05.2009, 00:41
Нет, не то же самое. L"Я" кодируется в wide-char, а они в Linux - ровно 4 байта
А просто "Я" - вероятно, в UTF-8 - переменный размер символа от 1 байта.
1
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,305
09.05.2009, 16:18
Цитата Сообщение от #pragma Посмотреть сообщение
Тогда почему Код C++1
sizeof("Я")==3??
может у тебя компилятор кирилицу как Unicode воспринимает
0
 Аватар для Spaum145
2 / 2 / 1
Регистрация: 23.08.2009
Сообщений: 21
02.06.2011, 14:06
В двойных кавычках передался в функцию не символ, а его числовое значение, код символа
0
0 / 0 / 1
Регистрация: 15.09.2013
Сообщений: 7
15.09.2013, 18:07
На самом деле:
1) 'a' - это символ
2) "a" - это строка, в памяти хранится как 2 символа: 'a' и '\0'
3) В добавок ко всему этому кодировка. Однако при просчете кодировки, не забывайте о последнем символе - символе конца строки '\0'.
0
15.09.2013, 18:27

Не по теме:

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

0
0 / 0 / 1
Регистрация: 15.09.2013
Сообщений: 7
15.09.2013, 18:30
Лучше поздно чем никогда, верно?
0
15.09.2013, 18:59

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.09.2013, 18:59
Помогаю со студенческими работами здесь

Определение длины строки
Как определить длину строки? Функция Len(&quot;x&quot;) неработает с переменной.

Определение длины строки
нужна помощь о великих:) нужно вообщем ввести с клавиатуры строку состоящей не более 10 символов. Вывести ее на экран и определить...

Определение длины строки
Нужно в скрипте при вводе данных определить длину строки. Подскажите, как это делать? Скрипт ниже :))) function rclick2() { var...

Определение длины строки
Есть строка: InputStr dw 20, ?, 20 dup(?) Далее происходит ее ввод: lea DX, InputStr mov AH, 0Ah int 21h Затем вычисляется...

Массивы, определение длины строки
Задать массив студентов из 7 фамилий. Определить, сколько букв в самой длинной фамилии списка.


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru