为什么输入流从第二行输入中剪切一些字符 我编写了一个简单的C++程序,从输入中输入一个学生姓氏,然后是期中、期末和各种家庭作业成绩(如:Carlo 2 5,7,8)。 问题是,从第二行输入中,它删掉了一些学生的姓氏
一个例子为什么输入流从第二行输入中剪切一些字符 我编写了一个简单的C++程序,从输入中输入一个学生姓氏,然后是期中、期末和各种家庭作业成绩(如:Carlo 2 5,7,8)。 问题是,从第二行输入中,它删掉了一些学生的姓氏,c++,C++,一个例子 Enter the surname of each student followed by the midterm, final, and homework grades. Carlo 2 3 4 5 Bonandrini 2 3 4 5 Carlo 3.4 onandrini 3.4 正如你所看到的,第二个名字前面缺了一个b。 我尝试了不同的名字和名字的长度,但没有任何变化,它仍然削减了名字。 据我所知,问题来自输入本身 #include<vector> #i
Enter the surname of each student followed by the midterm, final, and homework grades.
Carlo 2 3 4 5
Bonandrini 2 3 4 5
Carlo 3.4
onandrini 3.4
正如你所看到的,第二个名字前面缺了一个b。
我尝试了不同的名字和名字的长度,但没有任何变化,它仍然削减了名字。
据我所知,问题来自输入本身
#include<vector>
#include<iostream>
#include<string>
#include<algorithm>
#include<ios>
#include<iomanip>
#include<stdexcept>
template<typename T>
T median(std::vector<T> vec) // Not passed by name because we sort the vector
{
typedef typename std::vector<T>::size_type vec_sz;
vec_sz size = vec.size();
if(!size)
throw std::domain_error("Median of an empty vector");
std::sort(vec.begin(), vec.end());
vec_sz pos = size / 2;
return size % 2 == 0 ? (vec[pos] + vec[pos-1]) / 2 : vec[pos];
}
template<typename T>
std::istream& operator>>(std::istream& stream, std::vector<T>& vec)
{
if(stream) // If stream is actually open
{
vec.clear(); // In case the vector wasn't empty
T x;
while(stream >> x)
vec.push_back(x);
stream.clear();
}
return stream;
}
struct StudentInfo
{
std::string name;
double midterm, final;
std::vector<double> homework;
};
double grade(const StudentInfo& student)
{
return 0.2 * student.midterm + 0.4 * student.final + 0.4 * median<double>(student.homework);
}
std::istream& operator>>(std::istream& stream, StudentInfo& student)
{
stream >> student.name >> student.midterm >> student.final;
stream >> student.homework;
return stream;
}
int main()
{
std::cout << "Enter the surname of each student followed by the midterm, final, and homework grades" << std::endl;
std::vector<StudentInfo> students;
std::string::size_type maxlen = 0;
StudentInfo student;
while(std::cin >> student)
{
maxlen = std::max(maxlen, student.name.size());
students.push_back(student);
}
std::sort(students.begin(), students.end(),
[](const StudentInfo& student1, const StudentInfo& student2){ return student1.name < student2.name; });
for(StudentInfo student : students)
{
// + 1 to put a space between the name and the grade
std::cout << student.name << std::string(maxlen + 1 - student.name.size(), ' ');
try{
double points = grade(student);
std::streamsize prec = std::cout.precision();
std::cout << std::setprecision(3) << points << std::setprecision(prec);
}
catch(std::domain_error e){
std::cout << e.what();
}
std::cout << std::endl;
}
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
模板
T median(std::vector vec)//未按名称传递,因为我们对向量进行了排序
{
typedef typename std::vector::size_type vec_sz;
vec_sz size=vec.size();
如果(!大小)
抛出std::域_错误(“空向量的中值”);
排序(vec.begin(),vec.end());
vec_sz pos=尺寸/2;
返回大小%2==0?(vec[pos]+vec[pos-1])/2:vec[pos];
}
模板
std::istream&operator>>(std::istream&stream,std::vector&vec)
{
if(stream)//如果流实际上是打开的
{
vec.clear();//如果向量不是空的
tx;
while(流>>x)
向量推回(x);
stream.clear();
}
回流;
}
结构学生信息
{
std::字符串名;
双倍期中、期末考试;
向量作业;
};
双年级(const StudentInfo和student)
{
返回0.2*学生期中+0.4*学生期末+0.4*中位数(学生作业);
}
std::istream&operator>>(std::istream&stream,学生信息&学生)
{
stream>>student.name>>student.midtime>>student.final;
流>>学生作业;
回流;
}
int main()
{
std::cout(学生)
{
maxlen=std::max(maxlen,student.name.size());
学生。推回(学生);
}
std::sort(students.begin(),students.end(),
[](const StudentInfo&student1,const StudentInfo&student2){return student1.name 我假设你的名字是指“最后一个”或“最后一个,第一个”之类的
如果是这种情况,问题在于您使用std::stream>>std::string。此输入在空格上取消。空格后的任何内容都被视为新字符串,除非您告诉它。如果期中考试是字符串而不是双精度的,空格后的部分将显示在那里。相反,它只是忽略它,因为它不知道如何将其转换为双精度一串
您需要的是std::stream.getline(),这可能会起到作用。您能缩小错误的来源吗?您能提供一个此错误失败的测试用例吗?一个例子会很理想,因为它有点代码。您的名字是什么意思?像First Last?不清楚“第二行输入”上到底是什么。输入的第一行是什么?每一行实际上是什么样子的?哪些字符被精确地“截断”了?在您的示例中,Carlos 2 5 7 8
在末尾缺少一个<0
值来告诉操作员>
停止循环。另外,让操作员>
调用流。clear()
读取输入错误后,不要这样做。这会阻止调用者正确检测流错误。这似乎对我有用。不过,我会使用getline,并从stringstream解析它。奇怪的是,您有一个自定义运算符>>但没有运算符按名称,我只指姓氏,所以这不是问题。好的。好吧,在t案例,你能给出一个测试案例、预期结果和实际结果吗?我已经把它放在了课程的开头question@CarloBonandrini我无法重现这个问题。唯一不同的是我控制循环的方式是:for(unsigned int I=0;I您使用什么来结束输入?我在macos中使用的行结束命令是ctrl+d。