所以我有一个分配的多数民众赞成给我一些麻烦我的CS类。我们的目标是不使用任何的cstring
功能来创建自己的非空终止字符串类。类中的数据必须包含字符串的长度,一个名为“数据” char*
,以及未涉及到我的问题一些其他的东西。
所以,当我去为字符串分配内存,我把它使用MyStrCopy(MyString* tar, const char* str)
分配内存,“长度”是通过在作为tar->data = new char[length]
CString的,因为预期其作品的长度str
功能。当分配内存这种方式,虽然,数组总是比我指定的(例如:我要求6个字节,我得到向上的11)大得多,字节我得到的数量似乎是随机的,每次运行不同。我试着写一个函数来剔除不需要的角色,但我想我只是缺乏技能/知识为我将如何实现这一目标。
这种额外的数据已经抛出一个平衡度欠佳的夫妇在我的职务,我坚持就如何解决它。有任何想法吗?
我下面定义我的班
#include <iostream>
#pragma once
class MyString {
private:
char* data;
int length;
static bool printAsUppercase;
int getLengnth(const char* str);
void MyStrCopy(MyString* tar, const char* str);
public:
// Constructors
MyString();
MyString(const char* data);
MyString(MyString& data2Copy);
~MyString();
// Operator Overloads
// Assignment Operator
MyString operator=(const MyString& data);
MyString operator=(const char* data);
// Arithmetic Operators
MyString operator+(const MyString& rightStr);
// Pre/Post decrement
MyString operator--();
MyString operator--(int);
// Boolean Operators
friend bool operator==(const MyString& leftStr, const MyString& rightStr);
friend bool operator>(const MyString& leftStr, const MyString& rightStr);
friend bool operator<(const MyString& leftStr, const MyString& rightStr);
// Streaming Operators
friend std::ostream& operator<<(std::ostream& os, const MyString& str);
friend std::istream& operator>>(std::ostream& is, MyString& str);
// Mutators
MyString& uppercase();
void cull();
// Accessors
int getLengnth();
};
和这里的落实。注意:这个最按预期目前没有工作。
#include "MyString.h"
// Constructors
MyString::MyString() {
data = NULL;
length = 0;
}
MyString::MyString(const char* data) {
MyStrCopy(this, data);
}
MyString::MyString(MyString& data2Copy) {
MyStrCopy(this, data2Copy.data);
}
MyString::~MyString() {
delete[] data;
}
MyString MyString::operator=(const MyString& data) {
MyString temp;
MyStrCopy(&temp, data.data);
return temp;
}
MyString MyString::operator=(const char* data) {
MyString temp;
MyStrCopy(&temp, data);
return temp;
}
void MyString::MyStrCopy(MyString* tar, const char* str) {
// WIP Something's not right with the NEW line
tar->length = getLengnth(str);
if (data != NULL)
delete data;
tar->data = new char[length];
for (int i = 0; i < tar->length; i++)
tar->data[i] = str[i];
tar->cull();
}
void MyString::cull() {
// WIP currently does effectively nothing
int currLen = getLengnth(data);
while (currLen > length)
data[currLen--];
}
int MyString::getLengnth() {
return length;
}
int MyString::getLengnth(const char* str) {
int len = 0;
while (str[len] != NULL)
len++;
return len;
}
提前致谢!
MyString::MyString(MyString& data2Copy) {
MyStrCopy(this, data2Copy.data);
}
这个,基本上,默认构造MyString
的新实例,而不调用MyStrCopy()
之前初始化它的任何成员。在MyStrCopy
:
if (data != NULL)
delete data;
因为无论data
,也没有任何新类的其他成员,被初始化 - 由于上述原因说明,data
这里将是随机的垃圾,从它这一点是所有不确定的行为。
你的意思是要做到:
new char[tar->length];
该length
属性没有初始化,所以你得到了一个未定义的行为,但我会在调试器步是肯定的。这是一些混乱的代码,因为MyStrCopy
是你不应该有一个明确的说法static
称之为非tar
功能,这意味着作为this
。
它会更有意义,调用这个函数copy(const char* data)
,而不是误导,类名称样式MyStrCopy
。通过只传给你需要像data
什么,并与性能直接,间接没有通过论证工作。
记住,你可以在另一个构造来定义构造函数:
MyString(const char* data);
MyString(const MyString& src) : MyString(src.data) { };
凡copy
功能完全消失,它只是第一个构造的一部分。
还有在这里的一些错字像getLengnth
所以一定要仔细检查一切。
所以事实证明,多余的字符,我在调试器中得到了调试器试图将通过继续打印字符,直到它找到了一个空,这可能是任何地方,因为我是不允许空终止很有帮助。我觉得其实有什么问题我的电脑,但没有它只是调试器。感谢所有在这个额外的输入;它真的帮助我弄清楚一些东西出来!