2009-10-29 40 views
1

我需要在類中存儲一個char數組然後返回它。我不得不承認,我對指針有些困惑,並且嘗試了所有我能想到但卻無法實現的方法。下面是我有:在一個類中存儲char數組然後返回它

#include <iostream> 
using namespace std; 

class Test { 
public: 
    void setName(char *name); 
    char getName(); 
private: 
    char m_name[30]; 
}; 

void Test::setName(char *name) { 
    strcpy(m_name, name); 
} 

char Test::getName() { 
    return *m_name; 
} 

void main() { 

    Test foobar; 
    char name[] = "Testing"; 
    foobar.setName(name); 
    cout << foobar.getName(); 
} 

當然,我期待的setName()存儲字符串「測試」之類裏面,的getName()應該返回「測試」。但是,我只能得到第一個字母T.我做錯了什麼?

我想我應該使用std字符串,但首先我想明白爲什麼這不起作用。據我所知,這應該與char數組一起工作?

+0

您是否注意編譯器警告? :( – 2009-10-29 07:28:22

回答

6

只返回一個指針:

const char* Test::getName() const 
{ 
    return m_name; 
} 

,並添加了class Test,將構造空字符結束的封裝陣列:

Test::Test() 
{ 
    m_name[0] = 0; 
} 

,這樣你就不會惹是生非,如果有人實例化class Test並且不在實例上調用setName()

+3

我也建議使用strncpy()而不是strcpy(),因爲這是C++,所以應該使用std :: string而不是char指針,這是從C – Wernsey 2009-10-29 07:27:27

+3

+1中使用'std :: string'。如果由於某種原因必須使用C字符串,則可以使用'std :: string'的'c_str()'成員函數返回一個C字符串。 – 2009-10-29 07:41:07

1

Test::getName()你只是返回一個字符(第一個字符)。相反,你應該從字符串開始即改變返回類型爲char*和return語句return m_name;

0

返回的第一個字符的地址,並使用更安全strncpy()strcpy()void Test::setName()

1

當你有指針p,指針解引用操作符*「跟隨」指針,因此表達式*p評估指針指向的任何對象。

在許多情況下,數組的名稱(如m_name)的行爲可能與指針類似。因此,*m_name的計算結果爲數組中的第一個char,因爲這是數組名,當解釋爲指針時,指向。

由於C中的字符串表示爲指向字符的指針,因此不應該對指針取消引用,而是完整地返回它。

許多人建議您使用strncpy()將輸入字符串寫入數組,因爲它會進行(某種)邊界檢查。然而,它不是最優的,它的語義很奇怪,而且將一個字符串複製到一個有限的緩衝區中並不是它的設計目的。這是更好地調查,如果你有一個各種環境中的snprintf()功能,並使用像這樣:

snprintf(m_name, sizeof m_name, "%s", name); 
0

如果你想這是C++根本不使用字符指針,除非你有一個非常,非常具體原因這樣做!從字符指針

切換到的std :: string,看看是否能解決你的問題:

#include <iostream> 
#include <string> 
using namespace std; 

class Test { 
public: 
    void setName(std::string name); 
    std::string getName(); 
private: 
    std::string m_name; 
}; 

void Test::setName(std::string name) { 
    m_name = name; 
} 

std::string Test::getName() { 
    return m_name; 
} 

void main() { 
    Test foobar; 
    foobar.setName("Testing"); 
    cout << foobar.getName(); 
} 

獎勵積分,使參數類型的setName一個const的std :: string &。

相關問題