有人可以告诉我以下是什么问题吗?
我正在尝试将字符添加到字符数组中。 name是指向MyString类中字符数组的指针。
void MyString::add_chars(char* c)
{
if(l < strlen(c)+strlen(name))
name = resize(name, l, sizeof(c));
int i,j;
for(i=0; i<strlen(c); i++) {
name[i+l-1] = c[i];
l++;
}
}
char* MyString::resize(char* vptr, int currentsize, int extra) {
char* temp = new char[currentsize + extra];
int i;
for (i = 0; i < currentsize; i++) {
temp[i] = vptr[i];
}
vptr = temp;
return vptr;
}
主要是:
MyString g ("and");
g.add_chars("baasdf");
cout << g.get_name() << "\n";
但get_name返回“andb”。我该如何修复我的代码?
修改: 更新了代码,结果仍然相同..
void StringList::add_chars(char* c)
{
char* my_new_string = resize(name, l, sizeof(char));
if( my_new_string != NULL )
{
delete [] name;
name = my_new_string;
}
int i,j;
for(i=0; i<strlen(c); i++) {
name[i+l-1] = c[i];
l++;
}
name[l-1] = '\0';
}
char* StringList::resize(char* vptr, int currentsize, int extra) {
char* temp = new char[currentsize + extra + 1];
int i;
for (i = 0; i < currentsize; i++) {
temp[i] = vptr[i];
}
vptr = temp;
return vptr;
}
答案 0 :(得分:1)
这一行错了:
name = resize(name, l, sizeof(c));
您不应该使用sizeof(char*)
变量所属的c
,但您应该sizeof(char)
或仅{1}。
此外,请确保您在大小上执行+1操作,以处理字符串末尾的零终止char
。
答案 1 :(得分:0)
首先,我是否正确地认为这是学习“如何创建自己的字符串类”的学习练习? C ++已经有了一个内置的 string 类型,你应该总是更喜欢它。
sizeof
运算符产生其操作数的大小(以字节为单位),在本例中为 c ,其类型为char*
- 它看起来像你的实际上after是以null结尾的字符数组的长度(“C”字符串“) - 你已经在使用 strlen ,所以我建议你只想再次使用它。也考虑了一个空终结符)
name = resize(name, l, strlen(c) + 1);
请注意,您的代码看起来好像存在内存泄漏。您正在为 name 变量分配一个新值,而不会先清除那里存在的任何内容。
if(l < strlen(c)+strlen(name))
{
char* my_new_string = resize(name, l, strlen(c));
if( my_new_string != NULL )
{
delete [] name;
name = my_new_string;
}
}
EDIT :正如其他回复所指出的那样,代码仍有很多错误,可以使用C ++的string
和vector
来解决。
这是一种可以实现add_chars
的方法void MyString::add_chars(char* c)
{
if( c != NULL && name != NULL )
{
size_t newlength = strlen(c) + strlen(name) + 1;
char* newstring = new char[newlength];
if( newstring != NULL )
{
size_t namelength = strlen(name);
size_t remaining = newlength - namelength;
strncpy( newstring, name, newlength );
strncpy( &newstring[namelength] , c, remaining );
delete [] name;
name = newstring;
}
}
}
答案 2 :(得分:0)
如何修复我的代码?
不要修理它。扔掉它并使用vector<char>
或string
。
但我坚持说,我该如何修复我的代码呢?
好的,好的,这就是......
resize
时,请注意sizeof(c)
(已分配到extra
的{{1}}参数。当你意识到这不是你的期望时,问问自己:resize
的目的是什么,你就会理解为什么。顺便说一句,由于所有这些sizeof
s,你的内存泄漏和性能都很差。