有谁能告诉我为什么我的功能在第一个字母后不打印第一个字母?这是我的代码。
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
++-++-+-
答案 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;
}
}