创建具有`new`产生比我指定多个字符的字符数组。 C ++

问题描述 投票:3回答:3

所以我有一个分配的多数民众赞成给我一些麻烦我的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;
}

提前致谢!

c++ arrays pointers dynamic-memory-allocation
3个回答
3
投票
MyString::MyString(MyString& data2Copy) {
  MyStrCopy(this, data2Copy.data);
}

这个,基本上,默认构造MyString的新实例,而不调用MyStrCopy()之前初始化它的任何成员。在MyStrCopy

if (data != NULL)
    delete data;

因为无论data,也没有任何新类的其他成员,被初始化 - 由于上述原因说明,data这里将是随机的垃圾,从它这一点是所有不确定的行为。


3
投票

你的意思是要做到:

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所以一定要仔细检查一切。


0
投票

所以事实证明,多余的字符,我在调试器中得到了调试器试图将通过继续打印字符,直到它找到了一个空,这可能是任何地方,因为我是不允许空终止很有帮助。我觉得其实有什么问题我的电脑,但没有它只是调试器。感谢所有在这个额外的输入;它真的帮助我弄清楚一些东西出来!

© www.soinside.com 2019 - 2024. All rights reserved.