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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 186, средняя оценка - 4.61
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

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

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

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

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

Неверное определение длины строки - C++
Всем привет. почему так происходит? пишу так char* nama = new char; cout << "strlen = " << strlen(nama) << endl; выводит...

Определение длины заранее неопределенной строки - C++
Добрый день. Возник вопрос с определением длины строки. Если она заранее определена, то используя функцию strlen() я легко получаю нужное...

Ввод строки, определение ее длины, и удаление в ней всех пробелов - C++
Введите строку, определите ее длину, и удалите в ней все пробелы (предложите вариант без использования стандартного метода erase!

Какие методы класса fstream отвечают за определение количества строк в файле и длины строки? - C++
Привет всем. Знакомлюсь я тут с потоковым файловым вводом-выводом, скажите пожалуйста, какие методы класса fstream, отвечают за определение...

Ошибки (в файле содержатся строки разной длины - записать их в выходной файл в порядке возрастания длины строки) - C++
#include <iostream> #include <set> #include <iterator> #include <fstream> #include <string> #include <algorithm> int main()...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.05.2009, 22:11  [ТС] #16
||=== 5.9, Debug ===|
/media/Part2/C++/Projects/CodeBlocks/5.9/string.cpp|8|предупреждение: multi-character character constant|
||=== Build finished: 1 errors, 0 warnings ===|
0
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
08.05.2009, 22:13 #17
Да не "Я", а 'Я', в одинарных кавычках.
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
08.05.2009, 22:18 #18
Цитата Сообщение от #pragma Посмотреть сообщение
Как?Что,"c"это уже не char?
угу... это строка (и по ходу +'\0')
1
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.05.2009, 22:28  [ТС] #19
Цитата Сообщение от Gravity Посмотреть сообщение
Да не "Я", а 'Я', в одинарных кавычках.
Так я так и писал,просто скопипастил,а система видит этот символ как мультисимвол))
0
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
08.05.2009, 22:53 #20
Мда... бред какой-то, ну получается, что у тебя и правда символы кириллицы занимают по 2 байта.
0
Evg
Эксперт CАвтор FAQ
17809 / 6019 / 388
Регистрация: 30.03.2009
Сообщений: 16,535
Записей в блоге: 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' }
1
ISergey
Maniac
Эксперт С++
1374 / 885 / 52
Регистрация: 02.01.2009
Сообщений: 2,658
Записей в блоге: 1
08.05.2009, 23:04 #22
Цитата Сообщение от Evg Посмотреть сообщение
Потому что это в юникоде
Должно быть 4.
C++
1
2
cout<<sizeof(L'Я')<<endl;//2
cout<<sizeof(L"Я")<<endl;//4
1
Evg
Эксперт CАвтор FAQ
17809 / 6019 / 388
Регистрация: 30.03.2009
Сообщений: 16,535
Записей в блоге: 26
08.05.2009, 23:15 #23
Хм... там и на ноль два байта уходит?
0
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.05.2009, 23:15  [ТС] #24
Evg, а что такое длина указателя?размер занимаемой памяти? Это только у меня в системе так?То есть в моей системе длина указателя на символ в юникоде(а "Я" вюникоде) занимает 2 байта,и поэтому размер массива удваивается?

"Вы отправили слишком большое кол-во отзывов за 24 часа"
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 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' - один байт.
3
Alexiski
Любитель давать советы
339 / 131 / 2
Регистрация: 12.01.2009
Сообщений: 511
08.05.2009, 23:20 #26
Скорее всего, строка в UTF-8. Тогда так и будет. Переменная длина символа.
1
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.05.2009, 23:35  [ТС] #27
Всем огромное спасибо,это был очень полезный для меня вопрос.Выходит,от кириллицы пока придётся отказатся вообще... программы с 'я' не компилятся вообще,и я не вижу решения.Если у кого-то есть,милости просим)
0
Evg
Эксперт CАвтор FAQ
17809 / 6019 / 388
Регистрация: 30.03.2009
Сообщений: 16,535
Записей в блоге: 26
08.05.2009, 23:38 #28
Цитата Сообщение от #pragma Посмотреть сообщение
Evg, а что такое длина указателя?размер занимаемой памяти? Это только у меня в системе так?То есть в моей системе длина указателя на символ в юникоде(а "Я" вюникоде) занимает 2 байта,и поэтому размер массива удваивается?
Длина указателя - такого термина вроде бы и нет. Ты скажи конкретнее, в каком контексте ты это видел/слышал/читал

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

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

Давай немного поясню. Когда ты делаешь инициализацию массива без указания длины, то его размер становится равным длине указателя
Вот здесь
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
08.05.2009, 23:48 #30
Цитата Сообщение от #pragma Посмотреть сообщение
Всем огромное спасибо,это был очень полезный для меня вопрос.Выходит,от кириллицы пока придётся отказатся вообще... программы с 'я' не компилятся вообще,и я не вижу решения.Если у кого-то есть,милости просим)
Попробуй сделать следующее.
В начале исходника вставь:
C++
1
#define _UNICODE
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2009, 23:48
Привет! Вот еще темы с ответами:

Текстовый файл содержит строки – предложения разной длины. Записать их в выходной файл в порядке возрастания длины строки - C++
Текстовый файл содержит строки – предложения разной длины. Записать их в выходной файл в порядке возрастания длины строки.

Текстовый файл содержит строки – предложения разной длины. Записать их в выходной файл в порядке возрастания длины строки - C++
ребят всю голову сломал уже завтра уже надо сдавать(( Текстовый файл содержит строки – предложения разной длины. Записать их в...

Определение длины файла в С - C++
Как определить длину двоичного файла в С?

Определение длины подпоследовательности - C++
Вот такое задание у меня: составить программу для определения длины самой длинной неубывающей подпоследовательности в последовательности...


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

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

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