C++使用getline输入字符串数组时非首元素首字符被忽略问题
问题原因
你的猜想完全正确,首字母丢失问题完全是循环内多余的cin.ignore()调用导致的。
- 使用
cin >>读取数值类内容(比如你代码里的numToppings)时,输入结束后用户按下的换行符\n会残留在输入缓冲区中。此时第一次调用cin.ignore()是合理的,作用是跳过这个残留换行,避免后续第一个getline直接读取到空内容。 - 但
getline本身的特性是:读取到换行符后会自动将该换行符从输入缓冲区中移除,下一次读取的起始位置就是下一行内容的第一个字符。你在循环内每次调用getline前都执行了cin.ignore(),就会把每行配料名称的第一个字符直接丢弃,完全对应你遇到的olives输出为lives、cheese输出为heese的现象。
修复方案
直接删除循环内部的cin.ignore()调用即可,修复后代码如下:
cin.ignore(); getline(cin, name); petes.setCustomerName(name); for (int i = 0; i < numToppings; i++) { getline(cin, toppingNames[i]); }
内容的提问来源于stack exchange,提问作者David___S__
相关产品推荐
相关产品推荐

