如何在C++程序中使用cin.getline()读取含空格的商品名输入
问题排查
你修改的输入代码存在3个核心错误:
cin.getline()用法不符合要求:原生cin.getline()仅接收C风格字符数组(char*)作为第一个参数,你直接传入std::string类型的商品名变量会直接编译报错;同时第二个参数需要设置为允许读取的最大字符数,你传入商品总数numOfItems完全不符合参数定义。- 没有处理输入缓冲区残留的换行符:前面执行
cin >> numOfItems读取商品总数时,用户输入数字后按下的换行符会残留在输入缓冲区,直接调用getline()会把这个空换行识别为第一个商品的名称,导致第一次读取结果为空。 - 数值类型不能直接用
getline()读取:quantity是int类型、pricePerEach是double类型,getline()只能读取整行字符串内容,直接传入数值类型变量会编译报错。
正确实现方案
修改逻辑如下:
- 读取完商品总数后,调用
cin.ignore()清除缓冲区残留的换行符 - 读取带空格的商品名时,使用支持
std::string的getline(cin, 字符串变量)重载函数 - 数量、单价仍使用
cin >>读取,读取完成后再次调用cin.ignore()清除当前行剩余的换行符,避免影响下一轮商品名称的读取
修改后的完整代码如下:
#include <iostream> #include <string> #include <limits> using namespace std; struct lineItem { string groceries; int quantity; double pricePerEach; }; double sumPrice(lineItem *list, int size); void printGroceries(lineItem *list, int size); int main () { double salesTax; double subTotal, totalPrice; int i, numOfItems; cout << "Enter number of grocery items: "; cin >> numOfItems; cout << endl; // 清除输入缓冲区残留的换行符,避免后续getline读空 cin.ignore(numeric_limits<streamsize>::max(), '\n'); lineItem *receipt = new lineItem[numOfItems]; for (i = 0; i < numOfItems; i++) { cout << "Item " << i+1 << " name: "; // 读取整行内容到string类型的商品名变量 getline(cin, receipt[i].groceries); cout << "\tQuantity: "; cin >> receipt[i].quantity; cout << "\tPrice: $"; cin >> receipt[i].pricePerEach; // 读完数值后清除当前行残留的换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); } subTotal = sumPrice(receipt, numOfItems); cout << "Sub Total: $" << subTotal << endl; salesTax = .08 * subTotal; totalPrice = subTotal + salesTax; cout << "Sales Tax at 8% : $" << salesTax << endl; cout << "Total Price: $" << totalPrice << endl; printGroceries(receipt, numOfItems); delete [] receipt; return 0; } double sumPrice(lineItem *list, int size) { double sum = 0; for (int i = 0; i < size; i++) { sum += (list[i].quantity * list[i].pricePerEach); } return sum; } void printGroceries(lineItem *list, int size) { for (int i = 0; i < size; i++) { cout << (i + 1) << ":" << list[i].groceries << endl; } }
这里引入了<limits>头文件调用numeric_limits,可以确保把缓冲区中所有残留字符都清除到换行符为止,避免用户输入多余内容导致后续逻辑异常。
内容的提问来源于stack exchange,提问作者meeshell
相关产品推荐
相关产品推荐

