8

私が理解しているように、抽出演算子は最初に空白をスキップし、空白またはストリームの終わりに遭遇すると停止します。noskipwsを使用すると、先頭の空白を無視するのをやめることができます。

noskipwsを使用した次のプログラムがあります。

#include <iostream>
using namespace std;

int main()
{
    char name[128];

    cout<<"Enter a name ";
    cin>>noskipws>>name;
    cout<<"You entered "<<name<<"\n";

    cout<<"Enter another name ";
    cin>>name;
    cout<<"You entered "<<(int)name[0]<<"\n";

    return 0;
}

私の質問は次のとおりです。

  1. 最初の入力として「John」と入力すると、2番目のcin >>操作は入力を待機せず、宛先、つまり名前配列に何もコピーしません。宛先文字列を空に設定するだけでなく、2番目のcin>>が少なくとも改行またはストリームの終わりを転送することを期待していました。なぜこうなった ?

  2. 最初のcin>>ステートメントの入力として「JohnSmith」と入力した場合も同じことがわかります。2番目のcin>>ステートメントがスペースまたは「Smith」を宛先変数にコピーしないのはなぜですか?

プログラムの出力は次のとおりです。

Enter a name John
You entered John
Enter another name You entered 0


Enter a name John Smith
You entered John
Enter another name You entered 0

ありがとう!!!

4

1 に答える 1

14

>>文字列の基本的なアルゴリズムは次のとおりです。

skip whitespace
read and extract until next whitespace

を使用するnoskipwsと、最初のステップはスキップされます。最初の読み取りの後、空白に配置されるため、次の(および後続のすべての)読み取りはすぐに停止し、何も抽出されません。

>>文字列に空白を入れることはありません。より一般的には、空白は常に;の区切り文字であるため、withの使用>>には問題があります。時間通りに使用するのは理にかなっているかもしれませんが、通常は使用後すぐにリセットする必要があります。(これが理にかなっている場合は、を使用する場合です。この場合、ストリームは常に1文字を抽出します。)noskipws>>>>char

于 2012-06-08T10:13:10.667 に答える