2016-09-14 96 views
-4

我正在寫一個類的c + +應該添加一個字符串指針到一個數組。而不是添加一個指向字符串的指針我只是將第一個字符添加到數組中,但我希望能夠在之後調用整個字符串。如何將字符串的指針添加到列表中,以便我可以打印出整個字符串?使C++中的字符串指針和數組的指針

class Listptr{ 
    public: 
     Listptr(); 
     void append(char *item); 
    private: 
     int size = 5; 
     char * buffer; 
}; 

Listptr::Listptr(){ 
    buffer = (char*)malloc(size); 
    for(int i=0; i<size; i++){ 
     buffer[i] = NULL; 
    } 
} 

void Listptr::append(char *item){ 
    for(int i=0; i<size; i++){ 
     if(buffer[i] == NULL){ 
      buffer[i] = *item; 
      break; 
     } 
    } 

    for(int i=0; i<size; i++){ 
     cout << " " << buffer[i]; 
    } 
} 


int main() { 
    Listptr test; 
    char val[] = "test"; 
    char val2[] = "test2"; 
    test.append(val); 
    test.append(val2); 

} 
+1

選擇C++。 'std :: vector'是你的朋友反對UB&內存泄漏。 –

+1

'class Listptr {''Listptr :: Listptr(){'這顯然是C++代碼;請不要將C++代碼標記爲C. –

+0

是不是有沒有使用'std :: string'的原因? –

回答

1

你真的應該使用std::stringstd::vector<std::string>什麼的,因爲我在評論中提到。但是,您的代碼有幾個問題,我在下面解決了這個問題。主要是你需要一個指向char數組的指針,即一個char**而不是一個char*,然後你需要檢查以確保你沒有試圖打印一個只是一個空指針的char數組。你也沒有正確使用malloc。因此,對於教育目的,瞭解你做錯了什麼,而不是隻說「停下來,」這裏的固定碼:

class Listptr{ 
    public: 
     Listptr(); 
     void append(char *item); 
    private: 
     int size = 5; 
     char ** buffer; // char** 
}; 

Listptr::Listptr(){ 
    buffer = (char**)malloc(size * sizeof(char**)); // char** 
    for(int i=0; i<size; i++){ 
     buffer[i] = NULL; 
    } 
} 

Listptr::~Listptr() { 
    // Add destructor to free malloc-allocated memory when we're done 
    free(buffer); 
} 

void Listptr::append(char *item){ 
    for(int i=0; i<size; i++){ 
     if(buffer[i] == NULL){ 
      buffer[i] = item; 
      break; 
     } 
    } 

    for(int i=0; i<size; i++){ 
     if (buffer[i] != NULL) { // Do not dereference null pointer 
      cout << " " << buffer[i]; 
     } 
    } 
} 


int main() { 
    Listptr test; 
    char val[] = "test"; 
    char val2[] = "test2"; 
    test.append(val); 
    test.append(val2); 
} 

輸出

test test test2 
+0

我也同意關於'new'over'malloc'等問題的意見,但這是我認爲最接近你的代碼的工作版本。 –

+2

如果你喜歡內存泄漏,它「起作用」。 – PaulMcKenzie

+0

好點;我添加了一個析構函數。 –