代碼中先 cin >> choice,隨後連續兩次 getline(cin, str)。調試發現第一次 getline 直接返回空字符串,第二次才正常等待輸入。
while (cin >> choice) {
if (choice == 1) {
cout << "輸入明文:\n";
string ming;
getline(cin, ming); // 第一次:直接讀到空行
cin.sync();
cout << "輸入密文:\n";
string mi;
cin.sync();
getline(cin, mi); // 第二次:正常工作
...
}
}
cin >> choice 讀取整數後,**留下了換行符 \n 在輸入緩衝區中** 。
隨後的 getline(cin, ming) 遇到這個殘留的 \n,認為「讀完一行」(空行),立即返回空字符串,並消費掉該換行符。
第二次 getline 時緩衝區已空,正常等待用戶輸入。
cin.ignore() 清理緩衝區(推薦)cin >> choice;
cin.ignore(numeric_limits::max(), '\n'); // 丟棄至換行符
getline(cin, ming); // 正常工作
需包含 <limits> 頭文件。
getline 統一讀取所有輸入,再轉換類型string line;
getline(cin, line); // 讀整行
choice = stoi(line); // 轉整數
getline(cin, ming); // 直接讀下一行,無殘留問題
cin >> choice;
cin.get(); // 讀走殘留的 \n
getline(cin, ming);
缺點:若用戶輸入「123␣␣\n」多餘空格會殘留,不如方案 1 稳健。
getline + 字符串解析,避免 >> 与 getline 混用。>> 後緊跟 cin.ignore()** 。cin.sync() / fflush(stdin) —— 行為未定義/非標準。cout << (int)c)確認緩衝區內容。scanf("%d", &x) 後調用 fgets()/gets() 同樣會遇到殘留換行符,C 語言常用 getchar() 或 scanf("%*c") 清理。
牢記「格式化輸入留換行,整行讀取吃換行」這一規律,徹底告別此類坑。