输入功能时指针丢失值

时间:2015-04-04 18:27:38

标签: c++ pointers cin

我正在尝试使用自己的String类在控制台中创建基于文本的冒险游戏。虽然我在指针失去它的价值时遇到了麻烦。 以下是我认为导致问题的类的减少版本。 ReadAndLog()将'string'的值设置为用户输入。当调用ToUpper()时,值仍然正确,但是在输入length函数时,'string'位置的值是垃圾数据。任何有关正在发生的事情的见解都会很棒。提前谢谢。

STRING.H:

#ifndef STRING_H_
#define STRING_H_

class String
{
public:
    String();
    ~String();
    int Length();
    String & ToLower();
    String & ToUpper();
    void ReadAndLog();

private:
    char * string;
};

#endif

String.cpp:

#include "String.h"

String::String()
{
    string = nullptr;
}

String::~String()
{
    if (string != nullptr)
    {
        delete[] string;
        string = nullptr;
    }
}

int String::Length()
{
    if (string == nullptr)
        return 0;
    else
    {
        for (int i = 0; true; i++)
        {
            if (string[i] == '\0')
            {
                return i;
            }
        }
    }
}

String & String::ToLower()
{
    int length = Length();

    for (int i = 0; i < length; i++)
    {
        if (string[i] >= 'A' && string[i] <= 'Z')
            string[i] += 32;
    }

    return *this;
}

String & String::ToUpper()
{
    int length = Length();

    for (int i = 0; i < length; i++)
    {
        if (string[i] >= 'a' && string[i] <= 'z')
            string[i] -= 32;
    }

    return *this;
}

编辑 - ReadAndLog已更改

void String::ReadAndLog()
{
    char charArray[256];
    std::cin.getline(charArray, 256);

    for (int i = 0; true; i++)
    {
        if (charArray[i] == '\0')
        {
            if (string != nullptr)
            {
                delete[] string;
                string = nullptr;
            }

            string = new char[i + 1];

            for (int j = 0; j < i; j++)
            {
                string[j] = charArray[j];
            }

            string[i] = '\0';
            break;
        }
    }

    File::LogEntry((String)"User", string);
}

正在调用的代码在Game.cpp中调用:

String input;
input.ReadAndLog();
input.ToUpper();

2 个答案:

答案 0 :(得分:0)

char charArray [256]是ReadAndLog的本地。当函数退出时它会被处理掉。你需要分配一个新的内存块(并在你的析构函数中处理它),甚至更好,使用std :: string。

答案 1 :(得分:0)

这个

char charArray[256];
//...
string = charArray;

无法运作。您实际上是将本地变量的地址分配给字符串类的成员指针。稍后您尝试通过指针访问该局部变量,但在该时间点,该变量已超出范围,并且您正在访问无效的内存地址。

您可能应该熟悉c ++中的内存管理。