2015-04-04 64 views
0

我试图用我自己的String类在控制台中创建基于文本的冒险游戏。尽管我在指针失去价值时遇到了麻烦。 这里是我认为会导致问题的类的减少版本。 ReadAndLog()将'string'的值设置为用户输入。当调用ToUpper()时,该值仍然是正确的,但是在输入长度函数时,'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(); 
+0

_'delete [] string;'_你从哪里为你的'string'分配了内存?我无法从你的样本中发现它。 – 2015-04-04 18:35:00

+0

我的歉意,我已经削减了这部分。我有另一个构造函数,我从char []参数动态分配内存。 – user1929613 2015-04-04 18:41:46

+0

无论如何,标记的副本解释了你的'ReadAndLog()'代码有什么问题。而是使用'std :: vector'或任何其他适当的C++标准容器。 – 2015-04-04 18:44:33

回答

0

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

0

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

不能工作。你基本上把一个局部变量的地址赋值给你的字符串类的成员指针。后来你试图通过指针访问这个局部变量,但是在那个时候,变量已经超出了范围,并且你正在访问一个无效的内存地址。

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

+0

因此,我应该计算charArray的长度,然后说string = new char [length],然后遍历每个charArray的值?它是否正确? – user1929613 2015-04-04 18:39:29

+0

@ user1929613:你应该做的是在内部使用'std :: string'。 – MikeMB 2015-04-04 19:30:23