2016-10-04 21 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; 
} 

這個神祕的代碼給了我隨機的輸出。這是一個猜測您輸入的號碼的程序。相反,當您輸入一個隨機數並點擊輸入時,它會給出錯誤和YF等內容。通過測試代碼自己嘗試一下。如果你輸入1並按回車你將得到我們的號碼被打印出來。C++可能的編程Mystery?

  1. 我們的號碼是
  2. 回合數爲
  3. 數目爲r爲
  4. 數爲

有一些更奇怪的也一樣,如果你輸入666,你會得到:e :: _ S_normalize_catory catory未找到,如果您輸入333☻將打印出來。

還有很多。有些數字是空白的,但有些不是。

有人可以告訴我爲什麼發生這種情況!

已關閉:感謝幫助我。我現在關閉。你仍然可以聊天!

+10

'「你的號碼是」 +猜測;'沒有做什麼,你認爲它。 –

+1

你的循環何時結束? *千萬不要* * *顫抖* – Rakete1111

+0

這是你在編寫這段代碼時應該寫的代碼:'cout <<「你的編號是」+ 3;'。 – juanchopanza

回答

10

您需要更改

cout << "Your number is" + guess; 

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

在C++中,加入了許多以字符串文字數量不轉換爲字符串;它完全做了其他事情(指針算術)。

有關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,所以編譯器認爲你想要做指針運算,即使你將字符串轉化爲字符串,也需要猜測char *使用itoa才能正確顯示。使用< <可以更容易地使用流版本。)

1

通過在字符串的地址("Your number is" + guess)上添加一個整數值,您將得到一個指向字符串中某個字符或指向下一個字符的新地址。然後cout語句將打印所有字符,直到下一個空字節。

你重新發現緩衝區溢出的樂趣黑客...