2

ドキュメントには次のように記載されています。

istream::get ( char* s, streamsize n, char delim );

// Extracts characters from the stream and stores them as a 
// c-string into the array beginning at s

この関数が何をするのかを分析しようとしました。「値によって」ポインタを取ります。つまり、動的メモリを割り当ててポインタsを設定することはできません。sポインターが指し示すもののみを変更できます。

しかし、関数が動的メモリ割り当てを実行できない場合、長さが不明な出力を返すにはどうすればよいでしょうか? この機能はどのように使用すればよいですか? メモリを事前に割り当ててポインタを渡し、s自分で削除する必要がありますか?

4

3 に答える 3

5

ドキュメントは明確です:

それらを c-string として s から始まる配列に格納します

s読み取り文字列を収容するのに十分な大きさの有効な配列を指す必要があります。

長さが不明な出力を返すにはどうすればよいですか

最大長はわかっています(n実際n - 1には、1 文字が C 文字列の null 終端用に予約されているため)。

ただし、質問を考えると、のstd::stringオーバーロードを使用する方がおそらく適切ですgetline

于 2013-02-18T15:02:49.487 に答える
4

ssize のメモリ ( が指す) を事前に割り当て、それを関数の最初と 2 番目のパラメータにn渡す必要があります。このようにして、最大バイト数 (終端の null を含む) を読み取り、それらを が指すバッファーにコピーします。sngetns

バッファがローカル (たとえば、スタック上の配列) の場合、削除する必要はありません (実際には削除できません) ただし、バッファが動的 (つまり、new[]、malloc、operator new によって割り当てられる) の場合または何でも)、それに応じて解放する必要があります。

例:

const int n = 50;
char *s = new char[n];

cin.get(s, n);
//...

delete []s;

注:これは有効ですが、他の人がコメントしたように、std::string代わりに使用することをお勧めします。

于 2013-02-18T15:02:24.387 に答える
3

次のように使用する必要があります。

const int size = 10;
char s[size]; //large enough to fit string
stream.get(&s[0], size, '\n');

必要なバッファーを事前に割り当て、ターゲット文字列に十分な大きさであることを確認します。

于 2013-02-18T15:04:26.513 に答える