.compare不匹配从对象拉出的字符串

时间:2015-02-21 00:59:55

标签: c++11

我试图抛出一个学生对象的向量。如果我找到与我正在搜索的ID相匹配的ID,则会显示其信息。

然而,当我尝试找到一个特定的ID时,.compare没有看到匹配,即使它应该。

我的输出:第一行是我要查找的ID,第二行是当前查看的ID,然后是比较的结果。

a11111111
a22222222
-1
no match

a11111111
a11111111
-1
no match

要求更多代码,所以这里是整个程序:(在displayID中的问题)

头文件

#ifndef structures_h
    #define structures_h
    #include <vector>
    #include <iostream>
    #include <stdlib.h> 
    #include <stdio.h>
    #include <fstream>
    #include <sstream>
    #include <string>
    #include <algorithm>
    #include <stdio.h>
    #include <map>

    using namespace std;

主程序

#endif
typedef pair<string, string> Name; // first name, last name
typedef map<string, int> Grades; // map courses to scores


#include "struct.h"

class Student {
    public:
        void display(ostream& os) const;
        void setId(string);
        void setName(string, string);
        void setGrades(string, int);
        string getId();
        string getName();
        void getGrades();
        bool operator<(const Student &rhs) const { return id_ < rhs.id_; }



    private:
        string id_; // e.g. "a22222222"
        Name name_; // e.g. {"ned", "flanders"}
        Grades grades_;
};

void Student::setId(string id) {
    id_ = id;
}

string Student::getId() {
    return id_;
}

void Student::setName(string first, string last) {
    name_ = pair<string,string>(first, last);
}

string Student::getName() {
    return get<0>(name_) + ' ' + get<1>(name_);
}

void Student::setGrades(string course, int score) {
    grades_.insert(make_pair(course, score));
}

void Student::getGrades() {

    for(auto it = grades_.begin(); it != grades_.end(); ++it) {
        cout << it -> first << ' ' <<  it -> second << endl;
    }
}




vector<Student> addStudent(int count, int x, vector<Student>& vStu, string file) {
    string line, first, last;

    ifstream infile(file);

    while (getline(infile, line)) {

        vStu.push_back(Student());
        vStu[count].setId(line);
        getline(infile, line);
        istringstream iss(line);

        if (!(iss >> first >> last)) {
            cout << "failed to get name" << endl;
            break;
        }
        vStu[count].setName(first, last);

        getline(infile, line);
        istringstream iss2(line);
        if (!(iss2 >> x)) {
            cout << "failed to get class number" << endl;
            break;
        }

        for (int i = 0; i < x; i++) {
            string sClass;
            int grade;

            getline(infile, line);
            istringstream iss3(line);

            if (!(iss3 >> sClass >> grade)) {
                cout << "failed to get class and grade" << endl;
                break;
            }

            vStu[count].setGrades(sClass, grade);
        }
        count++;
    }
    return vStu;
}

void display(vector<Student>& vStu) {
    sort(vStu.begin(), vStu.end());
    cout << endl;
    int count = vStu.size();
    for (int i = 0; i<count;i++) {
        cout << vStu[i].getId() << endl;
        cout << vStu[i].getName() << endl;
        vStu[i].getGrades();
        cout << endl;
    }   
}

void displayID(vector<Student>& vStu, string ID) {
    int count = vStu.size();
    string test;
    ID = "a11111111";

    for (int i = 0; i<count;i++) {
        cout<< endl;

        test = vStu[i].getId();
        cout << ID << endl;
        cout << test << endl;
        cout << ID.compare(test) << endl;

        if (ID.compare(test) == 0) {
            cout << "match" << endl;
            cout << vStu[i].getId() << endl;
            cout << vStu[i].getName() << endl;
            vStu[i].getGrades();
            cout << endl;
        } else {
            cout << "no match" << endl;
        }
    }   
    cout << endl;
}


void mainMenu(vector<Student>& vStu) {
    string input;
    string word;
    vector<string> com;

    while(1) {
        cout << "Enter command: ";
        getline(cin,input);

        istringstream iss(input);

        while(iss >> word) {
            com.push_back(word);
        }
        for (int i = 0; i < (int)com.size(); i++) {
            transform(com[i].begin(), com[i].end(), com[i].begin(), ::tolower);
            if (com[i] == "show") {
                display(vStu);

            } else if (com[i] == "showid") {
                displayID(vStu, "a11111111");

            }

        }

    com.clear();
    }
}

int main(int argc, char *argv[]) {
    vector<Student> vStu;
    int count = 0, x = 0;


    if (argc != 2) {
        cout << "Incorrectly called" << endl;
        cout << "    "  << argv[0] << ' ' << "<filename>" << endl; 
        return 1;
    }

    addStudent(count, x, vStu, argv[1]);
    mainMenu(vStu);


}

1 个答案:

答案 0 :(得分:0)

我看到的唯一可能性是string末尾有一些空格被传递到你的函数中。在比较之前尝试修剪string的结尾,如this thread所示,并查看它们是否仍然无法正确比较。