2015-04-04 193 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