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

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

08.05.2009, 19:41. Показов 31563. Ответов 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
1465 / 966 / 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
3605 / 2745 / 356
Регистрация: 11.03.2009
Сообщений: 6,313
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
Ответ Создать тему
Новые блоги и статьи
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru