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

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

08.05.2009, 19:41. Показов 31049. Ответов 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
3599 / 2741 / 354
Регистрация: 11.03.2009
Сообщений: 6,299
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru