2012-11-25 53 views
2

舉例來說,如果我從用戶獲得學生的姓名,並使用cin.getline(student.name, 50);我可以指定學生姓名。我不能通過student.name = "John Doe";明確指定學生姓名,因爲您不能僅複製一個數組,但爲什麼在我使用getline函數時會工作?有什麼不同?是不是getline()收集一個字符數組,然後將其複製到studnet.name呢?爲什麼cin.getline分配給字符數組,但使用'='不會?

爲了澄清,我問爲什麼,我可以使用cin.getline(student.name, 50)指定一個學生的名字,但沒有stuent.name = "John Doe",是什麼2種方法(爲什麼getline()作品和直接分配不工作)之間的差異。

+0

'name'是個'char'數組嗎?如果是這樣,數組是不可分配的,所以你不能寫'arrayname =「blah」;'。另外,除非你有一個非常好的理由,否則你應該使用'std :: string'而不是'char'數組。 – Praetorian

+0

@Praetorian您的評論似乎是一個合適的答案,爲什麼不這樣做呢? –

+0

我不是問如何分配'char name [50] =「John Doe」',我問爲什麼'cin.getline(student.name,50)'工作,而直接分配does not。最後,我要問的區別是2 –

回答

2

如果您查看istream::getline函數的參數列表istream& getline (char* s, streamsize n);,您會注意到它將變量student.name作爲指針。這允許getline直接寫入C字符串的內存位置。

編輯:看禁衛軍在評論答案更詳細的解釋。

+0

哈,你剛剛總結@ Praetorian的評論? –

+1

哦,我沒有看到他的評論,我會給他信用。我記得在上個學期我也學會了cin.getline的同樣的東西,哈哈。 –

2

請參見下面的C FAQ問題 - http://c-faq.com/aryptr/arrayassign.htmlhttp://c-faq.com/aryptr/arraylval.html

我在這裏假設namechar name[something]

如果你想分配,使用std::string類型而不是char array

更改

char name[50]; 

#include <string> 
using std::string; 

... ... 

    string name; 

... ... 

現在你可以使用=像你想。

getline的作品,因爲它內部會做這樣的事情

  • 讀一個字符。

  • 分配來命名[0]

  • 讀取下一個字符。

  • 分配來命名[1]。

等等。

+0

正確我明白,如果我想使用字符串,但使用getline將分配從用戶到學生類的'char name [50]',我的問題是爲什麼工作和直接分配doesnt。 –

+0

'getline'分別分配每個字符(在循環中),就像'strcpy'函數一樣。 –

+0

@Howdy_McGee - 您是否在我的回答中檢查了2個常見問題解答鏈接?這將解釋爲什麼char數組不能直接分配。 getline可以工作,因爲它不是直接分配的。它通過字符賦值來完成一個char,就像'std :: string'一樣。 – user93353

相關問題