7

C++ でscanf("%d # %d",&a,&b);ある種の効果を達成する方法は?cin

4

5 に答える 5

4

#を文字に抽出することでスキップできます。

std::istringstream iss("10 # 20");

int main()
{
   int a, b; char hash;
   iss >> a >> hash >> b;

   assert(a == 10 && b == 20);
}
于 2014-02-13T21:01:07.897 に答える
1

istream残念ながら、クラス内にそれを模倣する直接的な関数はありません。ストリームを操作して正しい入力を取得するために使用できる関数がありますが、私はそれらがどのように機能するかについて詳しくないため、その方法を説明できませんでした.

私が個人的にどのように行うかについての私の最善の提案はgetline()、入力を文字列に入れるために使用し、そこからいくつかのチェックを行って、それがフォーマットに一致するかどうかを確認することです. したがって、あなたの場合、最初の部分文字列を最初のスペースまで取得し、それが有効な小数であることを確認し、シャープ記号 (「#」) が正しい場所にあることを確認してから、最後の数字を取得してそれが正しいことを確認します有効。これら 3 つのオブジェクトのいずれかが正しくない場合は、ブール変数をfalseキックアウトまたはリターンに設定するか、入力が無効で正しい形式ではないことを示す何かを設定します。

疑似コード:

...

getline(cin,myStr);

while(!formatCheck(myStr))
{
    cout<<"Not valid format for input";
    getline(cin,myStr);
}

...

bool formatCheck(string str)
{
    string firstPart=str.subString(0,firstSpaceLocation);
    string middle=str[firstSpaceLocation+1];
    string lastPart=str.subString(firstSpaceLocation+3,end);

    if(first part not a valid number || middle!="#" || last part not a valid number)
    {
        return false;
    }

    return true;
}
于 2014-02-13T21:23:36.983 に答える