C++ 将字符串复制到char数组 我试图复制一个字符串,它可能在中间包含字符数组到字符数组。 我构造了以下函数 void SaveStringToChar(string &mystring,const char * &ArrChar) {//begin function std::string str; char * writable = new char[str.size() + 1]; std::copy(str.begin(), str.end(), writable); writable[str.size()] = '\0'; ArrChar = writable; }//end function

C++ 将字符串复制到char数组 我试图复制一个字符串,它可能在中间包含字符数组到字符数组。 我构造了以下函数 void SaveStringToChar(string &mystring,const char * &ArrChar) {//begin function std::string str; char * writable = new char[str.size() + 1]; std::copy(str.begin(), str.end(), writable); writable[str.size()] = '\0'; ArrChar = writable; }//end function,c++,string,char,type-conversion,C++,String,Char,Type Conversion,我的问题是这个方法保证我不会丢失null元素后面的字符。 我的另一个问题是我得到了这个链接器错误,我不知道它是什么意思 /tmp/ccUpCRaz.o:在函数“Parser::RuleParser(char const*)”中: Parser.cpp:(.text+0x3f6):对Parser::SaveStringToChar(std::basic_string,std::allocator>&,char const*&)的未定义引用 collect2:ld返回了1个退出状态 任何提示 这是我

我的问题是这个方法保证我不会丢失null元素后面的字符。 我的另一个问题是我得到了这个链接器错误,我不知道它是什么意思

/tmp/ccUpCRaz.o:在函数“Parser::RuleParser(char const*)”中: Parser.cpp:(.text+0x3f6):对Parser::SaveStringToChar(std::basic_string,std::allocator>&,char const*&)的未定义引用 collect2:ld返回了1个退出状态

任何提示

这是我传递东西进行比较的函数

  void Search( size_t TextLength, const char *Text, const vector<const char *> &patterns );
void搜索(大小、文本长度、常量字符*文本、常量向量和模式);

您需要将函数定义为
解析器::
的成员。目前的定义是:

void SaveStringToChar(string &mystring,const char * &ArrChar)
改为:

void Parser::SaveStringToChar(string &mystring,const char * &ArrChar)
std::copy()
将复制所有字符。但是,调用方不知道
ArrChar
实际指向多少个字符,因为像
strlen()
这样的函数将在第一个空字符处停止计数。您可以更改
SaveStringToChar()
的签名,以接受另一个参数
size\t&ArrCharLen
,该参数将填充
ArrChar
中的字符数。当然,
mystring
的长度将为
ArrChar
,因此,在调用
SaveStringToChar()
之前,您可能已经存储了该长度

编辑(在
vector
comment之后):

一旦将
常量char*
添加到
向量
,实际字节数将丢失。为什么不使用
向量
,然后使用
std::string::length()
来了解
std::string
中实际存储了多少个字符

EDIT2(在将函数.c_str()与text.length()进行比较之后):


与其传递
.c_str()
.length()
来与
向量中的元素进行比较,只需将
std::string
传递给compare函数,并与
向量的元素进行比较:
std::string::operator==()
将正确比较嵌入空字符的字符串。然后可以使用
std::find()
向量中搜索从文件中读取的
std::string

需要将函数定义为
解析器的成员::
。当前定义为:

void SaveStringToChar(string &mystring,const char * &ArrChar)
改为:

void Parser::SaveStringToChar(string &mystring,const char * &ArrChar)
std::copy()
将复制所有字符。但是,调用方不知道
ArrChar
实际指向多少字符,因为像
strlen()
这样的函数将在第一个空字符处停止计数。您可以更改
SaveStringToChar()的签名
接受另一个参数
size\t&ArrCharLen
,该参数将填充
ArrChar
中的字符数。当然,
mystring
的长度将为
ArrChar
,因此在调用
SaveStringToChar()
之前,您可能已经存储了该参数

编辑(在
vector
comment之后):

一旦
const char*
添加到
向量
,真正的字节数就会丢失。为什么不使用
向量
,然后使用
std::string::length()
来知道
std::string
中实际存储了多少个字符

EDIT2(在将函数.c_str()与text.length()进行比较之后):


与其传递
.c_str()
.length()
来与
向量中的元素进行比较,只需将
std::string
传递给compare函数,并与
向量的元素进行比较:
std::string::operator==()
将正确比较嵌入空字符的字符串。然后,您可以使用
std::find()
向量中搜索从文件中读取的
std::string

字符串副本看起来不错,但如果您这样做是为了将char*传递给函数,则有更好的方法可以查看:

std::string str;
//...
my_func(str.c_str());

hmjd有您的链接错误。

您的字符串副本看起来不错,但如果您这样做是为了向函数传递char*,有更好的方法可以查看:

std::string str;
//...
my_func(str.c_str());

hmjd有您的链接错误。

请参阅hmjd的链接错误答案

对于复制的字符,实际上不会丢失任何字符,因为它们都被安全地复制到输出缓冲区。但是,如果在字符串中间有真的<代码> \ 0 < /代码>字符,则没有一个C样式字符串函数(如PrtTF)将正确工作。


调用例程也不知道字符串的长度,因此也不知道新分配的缓冲区大小。您也应该返回字符串长度(作为返回值,或在另一个引用参数中)。

有关链接错误,请参阅hmjd的答案

对于复制的字符,实际上不会丢失任何字符,因为它们都被安全地复制到输出缓冲区。但是,如果在字符串中间有真的<代码> \ 0 < /代码>字符,则没有一个C样式字符串函数(如PrtTF)将正确工作。 调用例程也不知道字符串的长度,因此也不知道新分配的缓冲区大小。您也应该返回字符串长度(作为返回值,或在另一个引用参数中)

我的问题是这个方法保证我不会丢失空元素后面的字符

整个字符串将被复制到缓冲区,即使它确实包含空字符。
std::copy
不会以任何方式解释它复制的数据,它只是复制您告诉它的元素数

但是,如果字符串确实包含空字符,则不能将其用于任何处理以空结尾的字符串的函数(例如
中的字符串);它们将解释f