2

たとえば、ユーザーから学生の名前を取得して使用する場合、cin.getline(student.name, 50);学生の名前を割り当てることができます。配列をコピーするだけではできないため、経由で生徒の名前を明示的に割り当てることはstudent.name = "John Doe";できませんが、getline関数を使用するとなぜこれが機能するのですか?違いはなんですか?getline()文字配列を収集してからコピーしませstudnet.nameんか?

明確にするために、なぜcin.getline(student.name, 50)生徒の名前を割り当てることができるのに使用できないstuent.name = "John Doe"のか、2つの方法の違いは何ですか(なぜgetline()機能するのか、直接割り当てが機能しないのか)を尋ねています。

4

2 に答える 2

2

次のCFAQの質問を参照してください-http ://c-faq.com/aryptr/arrayassign.htmlおよびhttp://c-faq.com/aryptr/arraylval.html

私はここでそれnameがであると仮定していchar name[something]ます。

割り当てる場合は、のstd::string代わりにタイプを使用しますchar array

あなたの

char name[50];

#include <string>
using std::string;

... ...

    string name;

... ...

今、あなたは=あなたが望むように使うことができます。

getline内部的にはこのようなことをするので動作します

  • 1文字を読み取ります。

  • name[0]に割り当てます

  • 次の文字を読んでください。

  • name[1]に割り当てます。

等々。

于 2012-11-25T04:35:49.627 に答える
2

istream :: getline関数のパラメータリストを見ると、変数、、がポインタとして使用されてistream& getline (char* s, streamsize n );いることがわかります。student.nameこれにより、getlineはc-stringのメモリ位置に直接書き込むことができます。

編集:より詳細な説明については、コメントのプラエトリアニの回答を参照してください。

于 2012-11-25T07:56:41.673 に答える