我有一个char指针:
char* s = new char[150];
现在如何填充它?这个:
s="abcdef";
给出警告,建议不要使用字符串文字和char*
之间的转换,但是通常可以。
此:
char* s = new[150]("abcdef");
不起作用,出现错误。
如何正确执行此操作?请注意,我希望内存分配具有150 * sizeof(char)字节并包含“ abcdef”。我了解malloc,但是可以使用new吗?
它是我不能使用标准库的作业。
答案 0 :(得分:7)
这一系列陈述
char* s = new char[150];
s="abcdef";
导致内存泄漏,因为首先分配了一个内存,并将其地址分配给了指针s
,然后用字符串常量"abcdef"
的地址重新分配了指针。而且,C ++中的字符串文字(与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] = '\0';
甚至是以下方式
#include <iostream>
#include <cstring>
int main()
{
const size_t N = 150;
char *s = new char[N]{ '\0' };
std::strncpy( s, "abcdef", N - 1 );
std::cout << s << '\n';
delete []s;
}
无论如何,最好使用标准类std::string
。
std::string s( "abcdef" );
或者例如
std::string s;
s.assign( "abcdef" );
答案 1 :(得分:3)
在不使用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");
答案 2 :(得分:2)
给出一个字符数组:
char * s = new char [256];
以下是填充指针的方法:
std::fill(&s, &s + sizeof(s), 0);
以下是填充 数组的方法:
std::fill(s, s+256, '\0');
以下是分配或复制文本到数组中的方法:
std::strcpy(s, "Hello");
您也可以使用std::copy
:
static const char text[] = "World";
std::copy(text, text + sizeof(text), s);
请记住,指针,数组和C-Style字符串是不同的概念和对象。
修改1:更喜欢std::string
在C ++中,更喜欢将std::string
用于文本而不是字符数组。
std::string s;
s = "abcdef";
std::cout << s << "\n";
答案 3 :(得分:1)
为该字符串分配内存后,可以使用strcpy
来填充它:
strcpy(s, "abcdef");