cin没有读完整个字符串

时间:2017-02-27 02:39:45

标签: c++ string input

我正在阅读Accelerated C ++一书中的练习,我遇到了在while循环中读取字符串的问题。代码似乎在一定程度上选择了它所读取的人名。有什么想法为什么会被切断?我已经进入Xcode进行调试,似乎全部名称都没有被读入。

代码的想法是,您可以键入学生的姓名,然后输入期中考试成绩,期末考试成绩,然后输入一系列作业成绩来计算他们的最终成绩。然后它将按字母顺序返回名称,并在其旁边显示最终标记,格式化为最终标记位于单个列中。

GradeFinder.ccp(主要)

#include <algorithm>
#include <iomanip>
#include <ios>
#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>
#include "grade.cpp"


using std::cin;
using std::cout;
using std::endl;
using std::domain_error;
using std::max;
using std::setprecision;
using std::sort;
using std::streamsize;
using std::string;
using std::vector;

int main()
{
    vector<Student_info> students;
    Student_info record;
    string::size_type maxlen=0;

    while (read(cin,record))
    {
    maxlen=max(maxlen,record.name.size());
    students.push_back(record);
    }

    sort(students.begin(),students.end(),compare);

    for (vector<Student_info>::size_type i=0; i!=students.size();++i)
    {
    cout<<students[i].name
        <<string(maxlen+1-students[i].name.size(),' ');

        try
        {
        double final_grade=grade(students[i]);
        streamsize prec=cout.precision();
        cout<<setprecision(3)<<final_grade
            <<setprecision(prec);
            }
        catch (domain_error e)
        {
            cout<<e.what();
        }
        cout<<endl;
    }
return 0;
}   

'Student_info.h'

#ifndef GUARD_Student_info
#define GUARD_Student_info

// Student_info.h header file
#include <iostream>
#include <string>
#include <vector>

struct Student_info {
    std::string name;
    double midterm, final;
    std::vector<double> homework;
};

bool compare(const Student_info&, const Student_info&);
std::istream& read(std::istream&, Student_info&);
std::istream& read_hw(std::istream&, std::vector<double>&);

#endif // GUARD_Student_info

Student_info.cpp(读取名称和相关标记的命令行输入)

#include "Student_info.h"

using std::istream;
using std::vector;

bool compare(const Student_info& x, const Student_info& y)
{
    return x.name<y.name;
}

istream& read(istream& is, Student_info& s)
{
    is >> s.name >> s.midterm >> s.exam;
    read_hw(is,s.homework);
    return is;
}

istream& read_hw(istream& in, vector<double>& hw)
{
    if (in)
    {
        hw.clear();

        double x;
        while (in>>x)
        hw.push_back(x);    
    in.clear();

    }
    return in;
}       

以下是命令行输入的一个例子,有趣的是Penelope这个名字在输入的第一个名字和Johnny总是没问题时会引起问题。

Chapter4 Alex$ ./GradeFinder 
Johnny 90 90 90 90 90
Frederick 80 80 80 80 80
Penelope 85 85 85 85 85
Polly 95 95 95 95 95 95
Johnny   90
lope     85
olly     95
rederick 80

Chapter4 Alex$ ./GradeFinder 
Penelope 85 85 85 85 85 
Frederick 80 80 80 80 80 80
Polly 95 95 95 95 95 95
Johnny 90 90 90 90 90 90
Johnny    90
Penelope  85
olly      95
rederick  80

1 个答案:

答案 0 :(得分:1)

似乎问题是当libc++出现在名称的开头时,使用libstdc++似乎会吞下某些字符(a,b,c,d,e,f,i,n,p,x)

通过将编译切换为libc++,它不再从名称中删除字符。但是,我仍然不确定如何在使用unpivot ( (current_value, new_value) for details in...)时解决此问题。

请参阅here以获取相同问题的答案。这似乎可能与Mac有关。