1

そのため、私は周りを見回しましたが、While ループ中に cin で何が起こっているのかを理解できませんでした。私は本 C++ Primer (第 5 版) を読んでいますが、演習の 1 つ中に、while ループを終了しない限り、cin を使用して文字列を取得できないことに気付きました。getline() を使用するだけでこの問題を修正しました。

現在の演習の目標は、0 ~ 15 の値からユーザー入力を求め、その数値を「16 進数」に変換することです (ここで、0 = 1、1 = 2、2 = 3、...、10 = A、11 = B)。本なしでこれを試みて失敗しましたが、本のコードに疑問を抱き始めました。本のコードは次のとおりです。

//Note: <iostream> and <string> have been included. using namespace std is used 
const string hexdigits = "0123456789ABCDEF";
cout << "Enter a series of numbers between 0 and 15"
     << " separated by spaces. Hit ENTER when finished: "
     << endl;
string result;
string::size_type n;

while(cin >> n)
    if (n < hexdigits.size())
        result += hexdigits[n];
cout << "Your hex number is: " << result << endl;

このコードを実行すると、コードを入力せずにEnterキーを押した後、whileループが終了することはありません(本質的に空白の入力を与えると思いますか?)。

私がここにいる理由は 2 つあります。

1) このコードが機能しないのはなぜですか? 2) 正しい方向に微調整していただければ幸いですが、このコードを正しく実行する方法についての回答はありません

理由 2 を妥協せずに理由 1 を受け取ることができない場合は、むしろ理由 1 を満たしてもらいたいと思います。

クイック編集: 申し訳ありませんが、Visual Studio 2012 を使用しています。

4

6 に答える 6

3

有効な数字を入力している限り、数字が読み上げられます。「さようなら」など、数字以外の何かを入力してループを終了することができます。行の先頭、つまり、Enter キーを押した直後に、Ctrl-Z を使用して標準入力を終了することもできるはずです (私は通常、Ctrl-Z を使用して標準入力を終了する UNIX ライクなシステムで作業しています)。 D)。

基本的に、ストリームは、その状態が設定されていない限り、 に変換されtrueます( を使用して の状態を確認できます)。ストリームから整数を正常に読み取る限り、失敗状態になる理由はありません。整数ではないものを入力すると、それが設定されます。同様に、ストリームの最後に到達したとき。std::ios_base::failbitstd::ios_base::badbitstreamstream.rdstate()std::ios_base::failbit

于 2013-10-10T23:47:41.063 に答える
1

@Protomega、同じコードを使用できますが、Ctrl+D を押して入力ストリームを停止します。

于 2013-10-11T01:03:16.353 に答える
0

Enter キーを押すと、プラットフォームに応じて、CR または LF、あるいはその両方が生成されます。これは有効な入力であるため、while ループを続行するための条件を満たしています。入力の最初でこれらの文字を明示的にテストするか、Ctrl-C を使用してループから抜け出す必要があります。

読みやすさの問題として、ループに入れたいコードを中かっこで囲みます。あなたが持っているのは有効なC++です。中括弧がないと、whileは次のステートメントでループし、条件付きの場合全体が単一のステートメントになるためです。単一行のループであっても、今すぐそれらを配置する練習をしてください。そうすれば、将来の頭痛の種であるデバッグの手間を省くことができます。

于 2013-10-10T23:46:10.387 に答える
0

これを行う簡単な方法があります。

const string hexdigits = "0123456789ABCDEF";
cout << "Enter a series of numbers between 0 and 15 separated by spaces. Hit ENTER when finished: " << endl;
string line;
string result;
if (getline(cin, line)) // get the whole line
{
    istringstream iss(result); // break them by spaces
    int i;
    while (iss >> i)
    {
        result += hexdigits[i];
        result += " ";
    }
    cout << "Your hex result:  " << result << endl;
}
else
{
    cout << "Error handling input!" << endl;
}

あなたのソリューションでは、Ctrl-D を押して入力を終了する必要があります。

于 2013-10-11T00:12:48.960 に答える
0

ループとしての While() と、そのwhile (cin >> n)括弧内にあるものを分けて考えてください。ループが始まると、括弧内に移動し、cin によって何かを入力するように求められます。これは、ループが始まるたびに発生します。この場合、ループを終了する方法はありません。それは私が言うことと同じです:

while (/*some condition*/) {
cin >> n; // this is always valid, true
}
于 2021-04-24T12:05:11.333 に答える