出於某種奇怪的原因,getline()函數不能像它應該那樣工作。我有我的程序循環通過遞歸(return main();)。下面的代碼第一次運行,沒關係。getline(cin,var)不工作!
cout << "Enter a phrase: ";
string user;
getline(cin, user);
但是,被調用的遞歸後,程序跳過步驟,讓我打字。效果是字符串用戶是空的。任何想法爲什麼?
謝謝。
出於某種奇怪的原因,getline()函數不能像它應該那樣工作。我有我的程序循環通過遞歸(return main();)。下面的代碼第一次運行,沒關係。getline(cin,var)不工作!
cout << "Enter a phrase: ";
string user;
getline(cin, user);
但是,被調用的遞歸後,程序跳過步驟,讓我打字。效果是字符串用戶是空的。任何想法爲什麼?
謝謝。
呼叫cin.clear()
在循環前清除任何標誌。
編輯:感謝@Xeo爲指出,也應該調用cin.ignore()
丟棄換行符 - 這可能仍然是在緩衝區...
主遞歸調用是不是在C明確界定++ (它在C中)。這可能是或不是你的問題的原因。
+1。令人驚訝的是,一個平臺實際上禁止這個功能將不會發出警告......但這正是這種會導致的症狀。 'iostream'依賴全局變量,當'main'重新進入時可能會重新初始化。 – Potatoswatter 2011-04-14 10:02:19
@Patatoswatter - 真的嗎?怎麼可能是這種情況?我可以理解,在第一次調用'main'之前會發生一些事情,但在隨後的調用中怎麼可能會發生這種情況 - 這只是函數調用?此外,用一個正常的遞歸函數進行測試,這個函數並不叫'main',而且我很可能會遇到同樣的問題... – Nim 2011-04-14 10:19:41
+1正確...編譯器注入任何初始化代碼/調用它是合法的喜歡在'main()'的開始處(這使得爲其他入口點無法爲可執行對象定義的平臺創建C++系統變得更加容易)。它很可能是重新初始化iostream的靜態變量(可能是內存泄漏或損壞),或者可能是Nim希望的和一個簡單的clear()會起作用 - 但這似乎很可能,如果遞歸對於實現基本上是安全的問題和以前的I/O操作實際上已經失敗。 – 2011-04-14 10:23:06
因爲換行符仍然在緩衝區中,所以可能還需要'cin.ignore'(至少這是我總是得到的行爲)。 – Xeo 2011-04-14 10:08:28
如果這是問題,解決方案可能是爲了避免首先設置錯誤標誌的情況。 – Potatoswatter 2011-04-14 10:10:17
@Xeo,那也將更新我的答案...... – Nim 2011-04-14 10:21:43