2016-01-05 1 views
5

私はビャーネ・ストロヴストルップのプログラミングを通じて働いている - C++を使用しての原則と実践し、次の例に来た:C++で文字列値をint変数に代入しようとしていますか?

#include "std_lib_facilities.h" 

int main() { 
    /* Name and Age input */ 
    cout << "Please enter your first name and age\n"; 
    string first_name = "???"; 
    int age = -1.0; 
    cin >> first_name >> age; 
    cout << "Hello," << first_name << "(age " << (age * 12) << " months)\n"; 
    return 0; 
} 

あなたはカルロス・22プログラムと入力を実行した場合、それが正しく出力意志Hello, Carlos (age 22)を。しかし、カルロスを22個入れた場合、出力はHello, 22 (age -1)であると言われています。なぜなら、「カルロスは整数ではないので、読み込まれません」。しかし、私はそれを実行すると、Hello, 22 (age 0)を返します。それは、ガベージ値を割り当てているようです。整数を入力しない限り、age変数に何かを代入しようとしない限り、なぜこのことが起こっているのか不思議です。私はブレークポイントでコードを実行し、非整数入力が入力されたらageの値が-1から0に変わることを確認しました。

何か間違っていますか?あるいは、これは私がXcodeを通してビルドしているという事実と、それに含まれているコンパイラが何であっても奇妙ですか?

+0

これはあなたが得ている「未定義の行動」です。このような場合、出力は何でもかまいません –

+4

C++ 11以降では、抽出が失敗したときにC++ 11より前にスカラー型を0に設定します。 – user657267

+0

@ user657267、ああ、ありがとう。私はそれがC++ 11の本の更新版であったので混乱しましたが、あなたのコメントを読んだ後、私は正誤表を調べました。ありがとう! – Dan

答えて

4

あなたがstd::strtolへの呼び出しで終わるコール

cin >> age; 

からの呼び出しの道をたどる場合。 strtolの戻り値は次のとおりです。変換が行われなかっすることができ

  • 場合は、0が返されます。

すべての抽出が成功したことを確認するために呼び出した後cinの状態を確認してください。

cin >> first_name >> age; 
if (cin) 
{ 
    // Extraction was successful. 
    // Use the data. 
} 
else 
{ 
    // Extraction was not successful. 
    // Deal with the error. 
} 
+1

ああ、それは理にかなっています。 "これは本当に正誤表ではありませんが、いくつかの実装では>>が失敗したときにintがゼロになります。最終的にはすべてが引き続きC++ 11になるまではありませんでした。あなたは実装のヴィンテージに応じて0または-1を得ます。 あなたが指摘したように、それは必要な標準を実装しています。ありがとう! – Dan

+1

@ダン、言語の父親でさえ、本はあまりにもずっと前に時代遅れになることは残念です。 –

関連する問題