C ++ - 函数不会打印第一个字母

时间:2017-04-12 05:54:24

标签: c++ c++11

有谁能告诉我为什么我的功能在第一个字母后不打印第一个字母?这是我的代码。

void plusScores(ifstream& in, ostream& out)
{
    string name;
    char score;
    int plus = 0;
    int minus = 0;;
    double sum;
    double percent;

    while (getline(in, name))
    {

        while (in >> score && (score == '+' || score == '-'))
        {
            if (score == '+')
                plus++;
            else if (score == '-')
            minus++;
        }

        sum = plus + minus;
        percent = (plus / sum) * 100;

        out << fixed << showpoint << setprecision(1);

        out << name << ": " << percent << "% plus" << endl;

        plus = 0;
        minus = 0;  
    }
}

我的输出应如下所示:

Kane, Erica: 40.0% plus
Chandler, Adam: 75.0% plus
Martin, Jake: 100.0% plus
Dillon, Amanda: 62.5% plus

相反,我得到了这个:

Kane, Erica: 40.0% plus
handler, Adam: 75.0% plus
artin, Jake: 100.0% plus
illon, Amanda: 62.5% plus

它正在阅读的文本文件如下所示:

Kane, Erica
--+-+
Chandler, Adam
++-+
Martin, Jake
+++++++
Dillon, Amanda
++-++-+-

3 个答案:

答案 0 :(得分:4)

当您到达&#34; - + - +&#34;行的末尾时,您的代码已读取名称的第一个字符。 getline不再需要阅读。这是因为in >> score会跳过空白字符。

您可以使用in >> std::noskipws >> score。但是,如果在+ - 和换行符之间有空格,这可能会在现实世界的应用程序中导致一些有趣的其他问题,您将读取空行&#34; name&#34;然后使用该名称计算零分数(除非名称的开头有+或 - 。)

另一种选择是始终如一地使用getline,而不是一次从输入文件中读取一个字符,读取一行,并在你得到的字符串中计算+和 - 。

第三种选择是&#34; unget&#34;输入中的最后一个字符。循环后,插入in.unget(score);以使用此方法。

所有这些方法的优缺点略有不同。一般来说,混合getline>>并不是一个好主意。

答案 1 :(得分:3)

因为while (in >> score && (score == '+' || score == '-'))会读取这些字母。由于它们不是+-,因此不会使用它们。

相反,我建议您对getline / +行使用-,然后计算完整版+-的数量串。 (参见this question了解如何计算它们。)

答案 2 :(得分:1)

修复您的代码:

void plusScores(ifstream& in, ostream& out)
{
string name;
string scores;

int plus = 0;
int minus = 0;;
double sum;
double percent;

while (getline(in, name))
{

    getline(in, scores);
    int loc = 0;
    while (loc < scores.length())
    {
        if (scores.at(loc) == '+')
            plus++;
        else if (scores.at(loc) == '-')
            minus++;
        loc++;
    }

    sum = plus + minus;
    percent = (plus / sum) * 100;

    out << fixed << showpoint << setprecision(1);

    out << name << ": " << percent << "% plus" << endl;

    plus = 0;
    minus = 0;  
}
}