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
我的问题是这个方法保证我不会丢失null元素后面的字符。 我的另一个问题是我得到了这个链接器错误,我不知道它是什么意思 /tmp/ccUpCRaz.o:在函数“Parser::RuleParser(char const*)”中: Parser.cpp:(.text+0x3f6):对Parser::SaveStringToChar(std::basic_string,std::allocator>&,char const*&)的未定义引用 collect2:ld返回了1个退出状态 任何提示 这是我传递东西进行比较的函数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个退出状态 任何提示 这是我
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