【问题标题】:Getline doesn't work as expectedGetline 无法按预期工作
【发布时间】:2013-12-02 00:13:41
【问题描述】:
#include <iostream>
#include <string.h>
using namespace std;

int main()
{
    int order[5];
    string carorder[5];
    int smallest=999999, where;
    string carname[5];
    float carprice[5];
    cout << "Enter car names then prices: ";
        cout << endl;
    for(int i=0; i < 5; i++){
        cin >> carname[i];
        //getline(cin, carname[i]);     can't do this -- why?
        cout << endl;
        cin >> carprice[i];
        cout << endl;
    }
    //BAD ALGORITHM//
       for(int m=0; m<5; m++){
    for(int j=0; j < 5; j++){

        if(carprice[j] < smallest){
            smallest = carprice[j];
            where = j;
        }

    }
    order[m] = smallest;
    carorder[m] = carname[where];
    carprice[where] = 999999;
    smallest = 999999;

   }
   //////////////////////////
    for(int w=0;  w<5; w++){
        cout << endl << "The car: " << carname[w] << " and price: " << order[w];
    }
    //////////////////////////
    return 0;
}

我正在用 C++ 做一个练习,它应该获取一辆车及其价格,然后按从低到高的顺序返回价格。挑战在于使用教授给出的算法,所以请不要介意那部分(我认为这是糟糕的算法)。我需要知道为什么我不能使用 getline(cin, carname[i]);和 cin >> carname[i];工作正常。我也尝试使用 cin.clear();和 cin.ignore();在getline之前,仍然不起作用。任何帮助表示赞赏。

【问题讨论】:

    标签: c++ getline


    【解决方案1】:

    格式化输入,即使用operator&gt;&gt;(),将跳过前导空格。此外,当接收到不符合格式的字符时,它将停止。例如,当读取float 时,输入将读取一个数字并在收到第一个空格时停止。例如,它将在用于输入当前值的换行符之前停止。

    未格式化的输入,例如使用std::getline(),不会跳过前导空格。相反,它会愉快地读取任何等待读取的字符。例如,如果下一个字符是换行符,std::getline() 会很高兴地停止阅读!

    通常,当从格式化输入切换到未格式化输入时,您希望去掉一些空白。例如,您可以使用 std::ws 操纵符跳过所有前导空格:

    std::getline(std::cin >> std::ws, carname[i]);
    

    您的输入完全未经检查:在使用结果之前不检查结果通常是个坏主意!您可能应该在某个时候测试流状态并可能将其恢复到良好状态,要求正确格式化的数据。

    【讨论】:

      猜你喜欢
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 2014-12-09
      • 2016-01-13
      • 2020-09-21
      • 2011-08-17
      • 2012-04-29
      相关资源
      最近更新 更多