c++ - C+ + - 正确填充字符指针

我有一个字符指针:


char* s = new char[150];



现在我该如何填充它? 这个:

 
s="abcdef";



 

给出字符串和char*之间转换的警告,但是,通常可以使用。

这个:


char* s = new[150]("abcdef");



不起作用,给出错误。

如何正确执行这个操作? 注意,我希望内存分配具有150*sizeof(char) 字节,并且包含"abcdef ",我知道malloc,但它可以用new吗?

时间:

这一系列的语句


char* s = new char[150];


s="abcdef";



导致内存泄漏,因为分配了内存,并且将它地址分配给指针s,然后指针被重新分配,而C (与c相对)中的字符串具有常量字符数组类型。

如果为字符串分配了内存,那么应该使用strcpy标准函数或C标准函数strncpy将字符串复制到内存中。

例如


char* s = new char[150];


std::strcpy( s, "abcdef" );



或者


const size_t N = 150;


char* s = new char[N];


std::strncpy( s, "abcdef", N );


s[N-1] = '';



甚至是以下方式


#include <iostream>


#include <cstring>



int main()


{


 const size_t N = 150;


 char *s = new char[N]{ '' };



 std::strncpy( s, "abcdef", N - 1 );



 std::cout << s << 'n';



 delete []s;


}



在任何情况下,最好使用标准类std::string


std::string s( "abcdef" );



或者举例来说


std::string s;


s.assign( "abcdef" );



为字符串创建内存区域,并且在不使用C++中的标准库填充内存区域的基本过程如下:

  • 使用new创建适当大小的内存区域
  • 使用循环将字符串中的字符复制到新区域中

所以源代码看起来就像:


// function to copy a zero terminated char string to a new char string.


// loop requires a zero terminated char string as the source.


char *strcpyX (char *dest, const char *source)


{


 char *destSave = dest; // save copy of the destination address to return



 while (*dest++ = *source++); // copy characters up to and including zero terminator.



 return destSave; // return destination pointer per standard library strcpy()


}



// somewhere in your code



char *s1 = new char [150];



strcpyX (s1, "abcdef");



给定一个字符数组:


char * s = new char [256];



下面是填充指针的方法:


std::fill(&s, &s + sizeof(s), 0);



下面是填充数组的方法:


std::fill(s, s+256, '');



以下是将文本分配或复制到数组中的方法:


std::strcpy(s, "Hello");



你也可以使用std::copy


static const char text[] = "World";


std::copy(text, text + sizeof(text), s);



请记住,指针,数组和C风格的字符串是不同的概念和对象。

编辑1:首选std::string
在C++中,更倾向于使用std::string而不是字符数组。


std::string s;


s = "abcdef";


std::cout << s << "n";



为该字符串分配内存后,可以使用strcpy来填充它:


strcpy(s, "abcdef");



...