You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++程序中使用cin.getline()读取含空格的商品名输入

问题排查

你修改的输入代码存在3个核心错误:

  • cin.getline() 用法不符合要求:原生cin.getline()仅接收C风格字符数组(char*)作为第一个参数,你直接传入std::string类型的商品名变量会直接编译报错;同时第二个参数需要设置为允许读取的最大字符数,你传入商品总数numOfItems完全不符合参数定义。
  • 没有处理输入缓冲区残留的换行符:前面执行cin >> numOfItems读取商品总数时,用户输入数字后按下的换行符会残留在输入缓冲区,直接调用getline()会把这个空换行识别为第一个商品的名称,导致第一次读取结果为空。
  • 数值类型不能直接用getline()读取:quantity是int类型、pricePerEach是double类型,getline()只能读取整行字符串内容,直接传入数值类型变量会编译报错。
正确实现方案

修改逻辑如下:

  1. 读取完商品总数后,调用cin.ignore()清除缓冲区残留的换行符
  2. 读取带空格的商品名时,使用支持std::string的getline(cin, 字符串变量)重载函数
  3. 数量、单价仍使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 12:45:04