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

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

3 голосов
/ 13 января 2011

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

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

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

Ответы [ 7 ]

10 голосов
/ 13 января 2011

Эквивалент C * strncpy() (который, кстати, пишется std::strncpy() в C ++ и находится в заголовке <cstring>) равен std::stringоператор присваивания:

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
3 голосов
/ 13 января 2011

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

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

std::string a = "hello!";

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

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

3 голосов
/ 13 января 2011

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

Кстати, что вы подразумеваете под "strncpy терпит неудачу в C ++"?

0 голосов
/ 06 августа 2014

Нет встроенного аналога. Вы должны свернуть свой собственный код.

#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 голосов
/ 13 января 2011

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

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

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

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

0 голосов
/ 13 января 2011

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 голосов
/ 13 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...