向字符数组 c++ 添加字符
Add characters to a character array c++
有人可以告诉我以下内容有什么问题吗?
我正在尝试向字符数组添加字符。 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] = ' ';
}
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;
}
这一行是错误的:
name = resize(name, l, sizeof(c));
你不应该采用sizeof(char*)
,你的c
变量是,但你应该做sizeof(char)
或只做1。
此外,请确保对大小执行 +1,以处理字符串末尾的零终止char
。
如何修复我的代码?
不要修复它。扔掉它并使用vector<char>
或只是string
.
好的,但我坚持,我该如何修复我的代码!?
好的,这是如何...
- 获取一个不错的调试器,例如这个。
- 仔细执行代码,不断检查变量并将它们与您期望的进行比较。
- 当您到达对
resize
的调用时,记下sizeof(c)
(分配给extra
参数resize
)。当你意识到这不是你所期望的,问问自己:sizeof
的目的是什么,你就会明白为什么。
顺便说一句,由于所有这些strlen
,您也有内存泄漏和非常差的性能。
首先,我假设这是您学习"如何创建自己的字符串类"的学习练习是否正确? C++已经有一个内置的字符串类型,您应该在大多数情况下始终喜欢它。
sizeof
运算符产生其操作数的大小(以字节为单位),在本例中为 C,其类型为 char*
- 看起来您实际追求的是以 null 结尾的字符数组("C"字符串)的长度 - 您已经在使用 strlen,所以我建议您只想再次使用它。 (也考虑空终止符)
name = resize(name, l, strlen(c) + 1);
请注意,您的代码看起来好像存在内存泄漏。 您正在为名称变量分配一个新值,而不会首先清除那里存在的任何内容。
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;
}
}
编辑:正如其他回复所指出的那样,代码仍然存在很多错误,可以使用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;
}
}
}
相关文章:
- 只能向C++添加一定数量的字符
- 如何在C++中为字符串添加字符?
- 如何将字符添加到已经大小的数组中?
- 向字符串添加字符
- 如何编写模板函数来添加整数但连接字符串和字符类型?
- 在字符串中的字符前添加空格C++插入函数
- std::字符串添加到字符*
- Qt UTF-8 文件到 std::string 添加额外的字符
- 编译器将随机字符添加到我的 char 数组中
- 为什么编译器不抱怨将字符添加到 char*?
- 将作为数学运算符的字符添加到随机字符串中
- 将字符添加到 std::cin
- 如何将点字符添加到字符串中的字符
- strftime 将不需要的字符添加到我尝试显示的内容中
- 当我将字符添加到空字符串(如 " " + c)时,为什么要返回未知值?
- 如何将字符添加到 2D 数组
- 将空格字符添加到附加的每个项目,以必须擦除最后一个项目.如何改进
- "b"作为字符添加到字符串中
- 如何将字符添加到字符串中
- C++将x个字符添加到字符串数组中