Что такое эквивалент strncpy
в C++? strncpy
работает в C, но не работает на C++.C++ Эквивалент strncpy
Это код, который я пытаюсь:
string str1 = "hello";
string str2;
strncpy (str2,str1,5);
Что такое эквивалент strncpy
в C++? strncpy
работает в C, но не работает на C++.C++ Эквивалент strncpy
Это код, который я пытаюсь:
string str1 = "hello";
string str2;
strncpy (str2,str1,5);
Вы можете использовать basic_string::copy по версии вашего const char*
std::string
или использовать std::copy, которые могут использовать указатели в качестве входных итераторов.
Что вы подразумеваете под «strncpy fail in C++», между прочим?
Вы не можете использовать 'std :: copy' без какой-либо причудливой работы, чтобы включить' n' в 'strncpy' –
@John - да, в общем, переход к std :: string и использование функций-членов предпочтительнее –
Эквивалент strncpy
в C++ - strncpy
.
Вы просто делаете что-то не так в своем коде, пожалуйста, разместите свой код и ошибку.
Это должен быть комментарий. И вы увидите, что много людей уже думали одно и тоже. Примите одно из своих, если вы согласитесь. –
Извините, когда я увидел вопрос, который я сразу начал отвечать, и его прервали на полпути. Когда я отправил ответ, комментарии были там :) – orlp
strncpy
работает на персонажей массива, и он прекрасно работает в C++, а также в С.
Если вы используете strncpy
с символов массива в C++, и он не работает, это, вероятно, из-за какой-то ошибки в ваш код на C++: покажите нам, если вам нужна помощь.
Если то, что вы ищете способ для копирования строк (то есть: std::string
), конструктор копирования струны или оператор присваивания будет делать то, что вы ищете:
std::string a = "hello!";
Это скопирует всю строку без риска переполнения буфера. В любом случае, как говорит Джон Диблинг в комментариях, он не дает ту же семантику strncpy
: она не позволяет указать, сколько символов нужно копировать.
Если вам нужно скопировать до определенного количества символов, существуют и другие способы: std::string
предлагает конструктор, который копирует до n
символов, или вы можете использовать другие способы, предлагаемые в других ответах.
Это не эквивалент 'strncpy' –
@ Джона Диблинга: э-э, почему бы и нет? – peoro
@peoro: Поскольку 'strncpy' копирует до' n' символов. Конструктор копий 'string', как вы его использовали, скопирует их все. –
Эквивалент Кассиопеяне strncpy()
(которые, кстати, пишется std::strncpy()
в C++, и это находится в заголовке <cstring>
) является std::string
«S оператор присваивания:
std::string s1 = "Hello, world!";
std::string s2(s1); // copy-construction, equivalent to strcpy
std::string s3 = s1; // copy-construction, equivalent to strcpy, too
std::string s4(s1, 0, 5); // copy-construction, taking 5 chars from pos 0,
// equivalent to strncpy
std::string s5(s1.c_str(), std::min(5,s1.size()));
// copy-construction, equivalent to strncpy
s5 = s1; // assignment, equivalent to strcpy
s5.assign(s1, 5); // assignment, equivalent to strncpy
Копирование конструкции должно использовать форму 'string (const char *, size_t)', чтобы быть эквивалентом 'strncpy' –
@John: Спасибо, я исправил это , – sbi
@John Dibling: Тем не менее, этот конструктор 'string (const char *, size_t)' не останавливается при первом обнаруженном пустом месте, который потенциально опасен для чего-то, возвращаемого 'c_str()'. @sbi: Должно быть 's5.assign (s1, 0, 4);' кроме того, что этот человек страдает от аналогичной проблемы (применяется, если 's1' содержит нулевой символ). –
strncpy доступен из cstring header
в C++. Потому что это C конкретная функция вам приходится иметь дело с C рода только строки, то есть символьные массивы, а не строка объектов C++
#include<cstring>
using namespace std;
int main(int argc, char *argv)
{
char *s,*v;
strncpy(s,v,0);
}
выше будет компилировать правильно, но не будет служить никакой полезной цели. Когда вы используете C++, попробуйте использовать объекты string
и его метод копирования оператора присваивания для назначения другой строке. Метод копирования принимает параметр, в котором вы можете указать количество копируемых символов для целевого строкового объекта.
strncpy не принимает std::string
в качестве аргументов. Прототипом является
char * strncpy (char * destination, const char * source, size_t num);
и предоставленная ссылка дает описание и пример того, как его использовать.
Я бы придерживаться std::string
, но если у вас есть, а затем использовать c_str()
std::string
метод получения char *
указатель
Там нет встроенных в эквиваленте. Вы должны перевернуть свою собственную strncpy.
#include <cstring>
#include <string>
std::string strncpy(const char* str, const size_t n)
{
if (str == NULL || n == 0)
{
return std::string();
}
return std::string(str, std::min(std::strlen(str), n));
}
Ha? нет встроенного эквивалента? –
Я имел в виду встроенный в std :: string. –
'strncpy' отлично работает на C++. Как вы его используете? Покажите нам код. –
'strncpy' не сбой в C++, если вы не ошибаетесь. –
Когда вы говорите, что это «не удается», что вы имеете в виду? Ошибка компиляции? Ошибка связи? Не дает ожидаемого результата? Сбой программы? –