C ++相当于strncpy

时间:2011-01-13 14:56:08

标签: c++ string

C ++中strncpy的等价物是什么? strncpy在C中工作,但在C ++中失败。

这是我正在尝试的代码:

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

7 个答案:

答案 0 :(得分:10)

相当于C strncpy()(其中,BTW,拼写为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

答案 1 :(得分:3)

您可以在std::string的{​​{1}}版本上使用basic_string::copy,或使用std::copy,它可以使用指针作为输入迭代器。

顺便说一句,“strncpy在C ++中失败了”是什么意思?

答案 2 :(得分:3)

strncpy适用于字符数组,它在C ++和C语言中都可以正常工作 如果你在C ++中使用strncpy字符数组,并且它不起作用,可能是因为你的C ++代码中有一些错误:如果你需要帮助,请告诉我们。

如果您正在寻找的是复制字符串的方法(即:std::string),字符串的复制构造函数或赋值运算符将执行您正在寻找的内容:

std::string a = "hello!";

这将复制整个字符串,而不会有任何缓冲区溢出的风险。无论如何,正如John Dibling在评论中所说,它不提供strncpy的相同语义:它不允许您指定要复制的字符数。

如果您需要复制一定数量的字符,还有其他方法:std::string提供复印机最多n个字符的构造函数,或者您可以使用其他答案中提出的其他方法

答案 3 :(得分:0)

strncpy可以从C ++中的cstring header获得。因为它是C特定的函数,你必须只处理C类字符串,即字符数组,而不是C ++的字符串对象

#include<cstring>
using namespace std;
int main(int argc, char *argv)
{
   char *s,*v;
   strncpy(s,v,0);
}

以上内容将正确编译,但没有用处。 在使用C ++时,请尝试使用string对象及其赋值运算符的复制方法来分配不同的字符串。 Copy方法采用一个参数,您可以在其中指定要复制到目标字符串对象的字符数。

答案 4 :(得分:0)

strncpy不会将std::string作为参数。原型是

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

,提供的链接提供了有关如何使用它的说明和示例。

我会坚持使用std::string,但如果必须,请使用c_str() std::string方法获取char *指针

答案 5 :(得分:-1)

C ++中strncpy的等效值为strncpy

您的代码中只是做错了,请发布您的代码和错误。

答案 6 :(得分:-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));
}