Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

STD string null-terminated?

12 views
Skip to first unread message

Michael N. Kuleshov

unread,
Dec 29, 2006, 4:30:27 AM12/29/06
to
Добрый день!

Строки string STL null-terminated?
Как лучше и правильно делать контроль на конец строки?
Каждый раз при увеличении индекса сравнивать со string.size()?

Михаил

john gladkih

unread,
Dec 29, 2006, 1:06:35 PM12/29/06
to
>>>>> "MNK" == Michael N Kuleshov <K...@stk.mmtel.ru> writes:

MNK> Добрый день!
MNK> Строки string STL null-terminated?
MNK> Как лучше и правильно делать контроль на конец строки?
MNK> Каждый раз при увеличении индекса сравнивать со string.size()?

c_str()

--
john, http://john.kak-sam.to

Andrey Tarasevich

unread,
Dec 30, 2006, 1:43:59 PM12/30/06
to
Fri Dec 29 2006 12:30, Michael N. Kuleshov wrote to All:

MNK> Строки string STL null-terminated?

В каком смысле? Легальные способы доступа непосредственно к сождержимому
'std:string' (итераторы, индексный доступ) позволяют доступаться только к
"значащим" символам строки, т.е. к символам в диапазоне 0..length()-1.
Соответственно, вопроса о terminated при таком доступе в принципе быть не
может - строка std::string по своей природе никак не является terminated
строкой, а является строкой с хранимой длиной.

Получать указатели на элементы строки и затем пытаться рассматривать результат
как C-строку не является легальным способом досупа к std::string

std::string s;
...
char* lpsz = &s[0];
printf("%s", lpsz); // <- не легально

хотя бы потому, что никто не гарантирует, что строка хранится в непрерывном
блоке памяти. А также потому, что никто не гарантирует пристутствия
нуль-терминатора.

std::string можно _сконвертировать_ в нуль-терминированную С-строку методом
'c_str()', но в общем случае при этом специально создается отдельная копия
исходной строки.

MNK> Как лучше и правильно делать контроль на конец строки?
MNK> Каждый раз при увеличении индекса сравнивать со string.size()?

Если выполняется индексный доступ, то да - "каждый раз при увеличении индекса
сравнивать со string.size()". Или что-то подобное.

Best regards, Андрей

john gladkih

unread,
Dec 30, 2006, 2:21:32 PM12/30/06
to
>>>>> "AT" == Andrey Tarasevich <atara...@telocity.com> writes:

AT> std::string можно _сконвертировать_ в нуль-терминированную С-строку методом
AT> 'c_str()', но в общем случае при этом специально создается отдельная копия
AT> исходной строки.

это где такая бредовая реализация?!

--
john, http://john.kak-sam.to

Andrey Tarasevich

unread,
Dec 30, 2006, 6:49:55 PM12/30/06
to
Sat Dec 30 2006 22:21, john gladkih wrote to "Andrey Tarasevich":

AT>> std::string можно _сконвертировать_ в нуль-терминированную С-строку

AT>> методом 'c_str()', но в общем случае при этом специально создается
AT>> отдельная копия исходной строки.

jg> это где такая бредовая реализация?!

"Бредовая реализация" - это конкретный случай. Я же веду речь об общем случае.

Best regards, Андрей

Timur Elzhov

unread,
Feb 21, 2008, 3:39:52 PM2/21/08
to
Fri Dec 29 2006 12:30, Michael N. Kuleshov wrote to All:

MNK> Строки string STL null-terminated?

Hет, там можно хранить всё.

MNK> Как лучше и правильно делать контроль на конец строки?
MNK> Каждый раз при увеличении индекса сравнивать со string.size()?

Вероятнее всего, тело этой ф-ции сожержится в хедере, представляет собой
лишь { return size; } и заинлайнится при компиляции, так что сравнение
с string.size() будет выполняться не медленнее, чем самого символа с '\0'

Тимур.

0 new messages