2011-01-13 2 views
3

Что такое эквивалент strncpy в C++? strncpy работает в C, но не работает на C++.C++ Эквивалент strncpy

Это код, который я пытаюсь:

string str1 = "hello"; 
string str2; 
strncpy (str2,str1,5); 
+7

'strncpy' отлично работает на C++. Как вы его используете? Покажите нам код. –

+2

'strncpy' не сбой в C++, если вы не ошибаетесь. –

+3

Когда вы говорите, что это «не удается», что вы имеете в виду? Ошибка компиляции? Ошибка связи? Не дает ожидаемого результата? Сбой программы? –

ответ

2

Вы можете использовать basic_string::copy по версии вашего const char*std::string или использовать std::copy, которые могут использовать указатели в качестве входных итераторов.

Что вы подразумеваете под «strncpy fail in C++», между прочим?

+0

Вы не можете использовать 'std :: copy' без какой-либо причудливой работы, чтобы включить' n' в 'strncpy' –

+0

@John - да, в общем, переход к std :: string и использование функций-членов предпочтительнее –

1

Эквивалент strncpy в C++ - strncpy.

Вы просто делаете что-то не так в своем коде, пожалуйста, разместите свой код и ошибку.

+2

Это должен быть комментарий. И вы увидите, что много людей уже думали одно и тоже. Примите одно из своих, если вы согласитесь. –

+0

Извините, когда я увидел вопрос, который я сразу начал отвечать, и его прервали на полпути. Когда я отправил ответ, комментарии были там :) – orlp

3

strncpy работает на персонажей массива, и он прекрасно работает в C++, а также в С.
Если вы используете strncpy с символов массива в C++, и он не работает, это, вероятно, из-за какой-то ошибки в ваш код на C++: покажите нам, если вам нужна помощь.

Если то, что вы ищете способ для копирования строк (то есть: std::string), конструктор копирования струны или оператор присваивания будет делать то, что вы ищете:

std::string a = "hello!"; 

Это скопирует всю строку без риска переполнения буфера. В любом случае, как говорит Джон Диблинг в комментариях, он не дает ту же семантику strncpy: она не позволяет указать, сколько символов нужно копировать.

Если вам нужно скопировать до определенного количества символов, существуют и другие способы: std::string предлагает конструктор, который копирует до n символов, или вы можете использовать другие способы, предлагаемые в других ответах.

+0

Это не эквивалент 'strncpy' –

+0

@ Джона Диблинга: э-э, почему бы и нет? – peoro

+0

@peoro: Поскольку 'strncpy' копирует до' n' символов. Конструктор копий 'string', как вы его использовали, скопирует их все. –

9

Эквивалент Кассиопеяне 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 
+1

Копирование конструкции должно использовать форму 'string (const char *, size_t)', чтобы быть эквивалентом 'strncpy' –

+0

@John: Спасибо, я исправил это , – sbi

+1

@John Dibling: Тем не менее, этот конструктор 'string (const char *, size_t)' не останавливается при первом обнаруженном пустом месте, который потенциально опасен для чего-то, возвращаемого 'c_str()'. @sbi: Должно быть 's5.assign (s1, 0, 4);' кроме того, что этот человек страдает от аналогичной проблемы (применяется, если 's1' содержит нулевой символ). –

0

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 и его метод копирования оператора присваивания для назначения другой строке. Метод копирования принимает параметр, в котором вы можете указать количество копируемых символов для целевого строкового объекта.

0

strncpy не принимает std::string в качестве аргументов. Прототипом является

char * strncpy (char * destination, const char * source, size_t num); 

и предоставленная ссылка дает описание и пример того, как его использовать.

Я бы придерживаться std::string, но если у вас есть, а затем использовать c_str()std::string метод получения char * указатель

-1

Там нет встроенных в эквиваленте. Вы должны перевернуть свою собственную 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)); 
} 
+0

Ha? нет встроенного эквивалента? –

+0

Я имел в виду встроенный в std :: string. –

Смежные вопросы