将一个常量cstring附加到我自己的String类对象
Appending a constant cstring to my own String class object
我正在编写自己的String类,但append函数有问题。它将一个连续的cstring作为参数,并将其附加在调用它的String的末尾
该功能具有以下原型:
void append(char *str );
预期工作:
String s1("John");
s1.append(" Doe");
s1.display();
结果应该是:
John Doe
我得到了什么
John
我在做什么
char*data是我的String类的数据成员。
将数据的内容复制到临时中。
重新定义大小等于temp+CStringToBeAppended+1 的数据
现在,将temp的内容复制到新的数据中。
将CStringToBeAppended的内容复制到新的数据中,从strlen(temp)开始。
这是我迄今为止拥有的功能:
//char * data is the data member of my String class.
void append(char* str)
{
char *temp = new char[strlen(data)+1];
for (int i=0; data[i] != ' '; i++)
temp[i] = data[i];
len = strlen(temp) + strlen(str);
data = new char [len+1];
for (int i=0; temp[i] != ' '; i++)
data[i] = temp[i];
for (int i=strlen(temp); str[i] != ' '; i++)
data[i] = str[i];
delete [] temp;
}
您的代码对传入的数据字符串进行了不必要的复制,通过终止逻辑进行复制进一步增强了这一功能。这就是你想要做的。
假设data
是而不是null,并且正确地0终止:
void append(const char *str)
{
if (!(str && *str))
return;
char *final = new char[ strlen(str) + strlen(data) + 1 ], *dst = final;
// copy in lhs
const char *src = data;
while (*src)
*dst++ = *src++;
// copy in rhs
while (*str)
*dst++ = *str++;
*dst = 0;
// swap pointers
std::swap(data, final);
// throw out prior result
delete [] final;
}
通过保留data
成员(data_len
)的分配大小的一个单独成员,可以大大提高的效率。使用std::copy()
或memcpy
移动数据更是如此,因为您已经知道了长度。否则,你的阑尾只不过是画家施莱梅尔打扮成一个花哨的班级。下面是使用std::copy()
的修改版本。我把管理data_len
成员和data
留给你
void append(const char *str)
{
if (!(str && *str))
return;
size_t dlen = strlen(data);
size_t slen = strlen(str);
char *final = new char[ dlen + slen + 1 ];
std::copy(data, data+dlen, final);
std::copy(str, str+slen+1, final+dlen);
std::swap(data,final);
delete [] final;
}
我对做了一些更改
Null
在复制数据后终止temp
- 使用变量
j
作为data
的起点。用strlen分配j(临时) data
的起始位置由i
替换为j++
void stringx::appendx(char* str) { int x = strlen(data); char *temp = new char[strlen(data)+1]; int i; for ( i=0; data[i] != ' '; i++) temp[i] = data[i]; temp[i] = ' '; //<----Change 1 len = strlen(temp) + strlen(str); data = new char [len+1]; memset(data,0,strlen(data)+1); for (int i=0; temp[i] != ' '; i++) data[i] = temp[i]; int j=strlen(temp); //<----Change 2 for (int i=0; str[i] != ' '; i++) data[j++] = str[i]; //<----Change 3 delete [] temp; }
相关文章:
- 找到所有与自己求和的数字X的快速方法,去掉一个数字得到N
- C++:我自己类的动态数组
- 如何设计一个安全地管理自己一生的Qobject
- C++:摧毁自己体内的lambda
- 关于使用我自己创建的类使用优先级队列的问题
- 对自己制造的类对象的情况不敏感分类
- Dokan:我应该自己处理文件共享和访问权限吗?
- 我自己解决的。指针,但我不知道为什么
- C - 如何将自己类型的值插入集合中
- 修改自己类的本地实例
- C++ stl unordered_map,线程安全,其中每个线程仅访问其自己分配的键,并且可以编辑该值
- 我已经寻找了MPI函数Scatterv的实现,但是我发现了任何可以帮助我编写自己的函数的东西
- 我自己类型的多维数组
- 我发现自己无法理解MPI_Gatherv的参数"recvcounts"
- 如何让我自己编写的迭代器支持 ->?
- 我应该总是用一个有自己索引的一维向量,还是一个多维向量
- C++:将自己结构的地址作为参数传递给pthread_create时出错:What覆盖了我的数据
- "addin.XLL is in a different format"问题,无法打开我自己创建的xll
- 如何在主程序 c++ 中使用我自己制作的数组头文件
- 创建由我自己签名的OpenSSL证书