Сабж:
The function does not append a null object to the string designated by s
Почему? Функция же сделана, чтобы копировать содержимое строки наружу, но придётся потом самому ещё и ставить 0 в конце (а конец ещё и не так просто узнать, ибо он вычисляется классом строки), либо извращаться (иначе не скажешь) через std::strcpy(s, str.c_str())
Здравствуйте, ntp, Вы писали:
ntp>Почему?
предположу, что для гибкости и это вписывается в идеологию плюсовых строк
вообще, нулевой терминальный символ есть только в си-строках
в std::string нет такого элемента (пробегитесь от begin до end и вы не найдете нулевого символа в простых строках)
дополнительно есть возможность хранить в std::string нулевые символы
std::string s(10, '\0'); // строка их 10 нулевых символов
в си-строках терминальный ноль имеет определенную семантику, по нему можно определить длину строки. а в std::string этот символ не несет семантики, а в c_str() его добавляют лишь для обратной совместимости с си
Здравствуйте, ntp, Вы писали:
ntp>Если мы копируем содержимое в char*, то, очевидно, мы хотим С-строку в большинстве случаев?
не очевидно, ведь внутри этого буфера могут быть другие данные
http://liveworkspace.org/code/11ef31deded24071e84a555642f91c3a
Здравствуйте, ntp, Вы писали:
ntp>Сабж:
ntp>The function does not append a null object to the string designated by s
ntp>Почему? Функция же сделана, чтобы копировать содержимое строки наружу, но придётся потом самому ещё и ставить 0 в конце (а конец ещё и не так просто узнать, ибо он вычисляется классом строки), либо извращаться (иначе не скажешь) через std::strcpy(s, str.c_str())
Потому что вы, как говорил один киногерой, видите жизнь из окна своего персонального автомобиля!
Применеие
copy значительно шире, чем вам представляется. Вы лишь рассматриваете один частный случай, когда копируемые символы должны составить результирующий символьный массив. Но есть еще ситуации, когда вам надо лишь
вставить символы в уже сфйормированный массив, то есть лишь обновить подстроку существующего массива. Если вы будете копировать 0, то вы тем самым разрушите исходный символьный массив. Представьте, к примеру, задачу, что вам просто нужно заменить комбинацию некоторых символов в исходном массиве эквивалентной по длине другой комбинацией символов. Тогда вы эту операцию просто будете не в состоянии сделать одним вызововм
copy.
То есть семантика
copy несколько иная, чем семантика
strcpy.
strcpy предназначена для
замены одной строки другой, а
copy предназначена ддля вставки символов в строку.