2016-10-04 14 views
3
#include <iostream> 

using namespace std; 

int main() 
{ 
    int loop = 0; 
    int Pass = 0; 
    int guess = 0; 
    cout << "Write In A 4 Digit Number!"; 
    cin >> Pass; 

    while (loop == 0) 
    { 
     guess = guess + 1; 

     if (Pass == guess) 
     { 
      cout << "Your number is" + guess; 
     } 

    } 
    return 0; 
} 

この謎のコードは私にランダムな出力を与えています。これは、あなたが入れた数字を推測するプログラムです。代わりに乱数を入力してEnterキーを押すと、エラーやYFなどのものが得られます。コードをテストして自分で試してみてください。 1を入力してEnterを押すと、番号が印刷されます。C++の可能性のあるプログラミングミステリー?

  1. 私たちの数は
  2. ウル数が
  3. Rの数が
  4. 数が
  5. 数が

あなたは666を入力した場合、あなたが取得するようないくつかのより多くの奇妙でもありますですですです:e :: _ S_normalize_catoryカタログが見つかりません。333を入力すると、☻が印刷されます。

もっとたくさんあります。いくつかの数字は空白ですが、いくつかは空白です。

誰かがこれがなぜ起こったのか教えてください。

締め切り:私を助けることへの感謝。私はこれを今すぐに閉じます。あなたはまだチャットすることができます!あなたは数値を文字列に変換しませんリテラル文字列に番号を追加し、C++で

cout << "Your number is " << guess; 

cout << "Your number is" + guess; 

を変更する必要が

+10

...ハッキングバッファオーバーフローの喜びを再発見;'あなたはそれがないと思う何をしません。 –

+1

ループはいつ終了するのですか? *決して* \ * shudder \ * – Rakete1111

+0

これはあなたがこれを理解しようとしている間に書いたはずのコードです: 'cout <<"あなたの番号は "+ 3;'です。 – juanchopanza

答えて

10

。それはまったく別のことをします(ポインタの算術演算)。

CおよびC++のバックグラウンド演算については、Everything you need to know about pointers in C(特にlast section about strings)を参照してください。

プログラムが面白い文字列を出力する理由は、guessが十分に大きくなると、"Your number is" + guessは文字列リテラルの最後の後に何らかのメモリを指し、プログラムはそのメモリ内に何か起こったものを出力します。 (技術的には、あなたがundefined behaviourの領域にいるので、あなたのプログラムは、合法的に奇妙なあらゆる方法で振る舞うことができます。)

2

のchar *である、とあなたが「推測」を追加している「あなたの番号です」それ。これはポインタを文字列リテラルの先頭以外に移動します。推測の値が小さい場合は、文字列のどこかで終了し、後続の部分を印刷します。大きい番号を入力すると、完全にランダムな場所にアクセスし、エラーが発生します。

試してみてください。

cout << "Your number is: " << guess;

(文字列+演算子を使用するには、少なくとも入力の一部が、あなたはのconstのchar *とint型を持つ文字列にする必要があるので、コンパイラはあなたを考えています。文字列リテラルを文字列にしても、正しく表示するにはitoaを使ってchar *を推測する必要があります。< <を使用してストリームバージョンに固執する方がずっと簡単です。)

1

文字列("Your number is" + guess)のアドレスに整数値を追加すると、文字列内の文字または次の文字を指す新しいアドレスが取得されます。次に、coutステートメントは、そこから次のヌルバイトまでのすべての文字を出力します。

あなたは+推測「あなたの番号が」 `

関連する問題