0

私は以下のプログラム:

string s;
cout<<"Enter a string:";
gets(s);

入力の形式は「Hilton Hotels」になると思います。

gets を使用すると、次のエラーが発生します。

 error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘char*’ for argument ‘1’ to ‘char* gets(char*)’

入力をスペースや「_」などの特殊文字で構成したいので、「cin」を使用できません。また、区切り文字を「enter」にしたいのです。他の方法はありますか...または、エラーを修正してください。

4

3 に答える 3

4

getsあまりC++ではありません(Cとの互換性のためです)。これを使って:

#include <iostream>
#include <string>

int main()
{
    std::getline(std::cin, s);
    std::cout << s << '\n';
}

また、空白処理オプションを参照しstd::ios::skipwsてください<iomanip>

于 2012-06-29T13:04:06.300 に答える
0

入力をスペースと特殊文字で構成したいので、「cin」を使用できません

使用できますcin

他の方法はありますか...または、エラーを修正してください。

getsは を受け取るchar*ので、 のchar*代わりにa を使用しstringます。

于 2012-06-29T13:04:27.143 に答える
0

最初の問題: 'gets' は、読み取る文字配列を取ります。stl 文字列を指定することはできません。意味がありません。次のようなことをする必要があります

char buf[1024];
gets(buf);

2 番目の問題: 'gets' は古い C stdio ライブラリからのものです。stdio アクセスと C++ スタイルの i/o を混在させようとしないでください。各ライブラリは独自のバッファリングを維持するため、混乱が生じるだけです。1 つを入力に使用し、もう 1 つを出力に使用すると、問題が解決する可能性がありますが、それは悪い考えです。C++ スタイルの入力を使用して、必要なことを行うことを学びます (std::getline は、私が思うに、ルーチンあなたが必要です)。

第三に、大きな問題: 'gets' は、C の初期の頃からの厄介なホールドオーバー関数の 1 つであり、安全に使用することはできません。「gets」を絶対に使用しないでください。

問題は、'gets' が読み込んでいるバッファーのサイズがわからないため、常にそのバッファーをオーバーフローさせ、メモリを上書きする可能性があることです (あらゆる種類の潜在的な問題を引き起こします)。gets を絶対に使用しないでください。stdio スタイルの入力を行いたい場合は、

fgets(buf, bufsize, stdin)

これはバッファサイズを取り、入力バッファをオーバーランしません。

于 2012-06-29T13:10:53.037 に答える