奇怪的超出范围错误

Ari*_*ria -1 c++ range

在下面的代码中,当我运行它时,我面临一个奇怪的超出范围错误.这段代码是Stroustrup使用C++编写的"编程原理和实践"一书的答案.

#include <Simple_window.h>
#include <iostream>
using namespace std;

//-----------------------------------

class Person
{
public:
    Person(string f_n, string s_n, int a) {
        for(int i=0; i<f_n.size() || i<s_n.size(); i++) 
            if(f_n[i] == ';' || f_n[i] == ':' || f_n[i] == '\'' || 
                f_n[i] == '[' || f_n[i] == ']' || f_n[i] == '*'  || 
                f_n[i] == '&' || f_n[i] == '^' || f_n[i] == '%'  ||
                f_n[i] == '$' || f_n[i] == '#' || f_n[i] == '@'  ||
                f_n[i] == '!' ||
                s_n[i] == ';' || s_n[i] == ':' || s_n[i] == '\'' || 
                s_n[i] == '[' || s_n[i] == ']' || s_n[i] == '*'  || 
                s_n[i] == '&' || s_n[i] == '^' || s_n[i] == '%'  ||
                s_n[i] == '$' || s_n[i] == '#' || s_n[i] == '@'  ||
                s_n[i] == '!')
                error("Bad characters!");
        first_name =  f_n;
        second_name = s_n;
        if(a < 0 || a >=150) 
            error ("Bad age!");
        age = a;
    }

    string get_first_name()  { return first_name; }
    string get_second_name() { return second_name; }
    int get_age()     { return age;  }
private:
    string first_name, second_name;
    int age;

};

//-------------------------------------------------------------

istream& operator>>(istream& is, Person& p) {
    string f_n, s_n;
    int a;
    cout <<"Enter first name and second name and age:";
    if(!(is >> f_n >> s_n >> a))
        error("Can't read the object");
    Person pp(f_n,s_n,a);
    p = pp;
    return is;
}

//-------------------------------------------------------

ostream& operator<<(ostream& os, Person& p) {

    if(!(os << p.get_first_name() <<' '<< p.get_second_name() << p.get_age()))
        error("Can't write the object");
    return os;
}

//------------------------------------------------------

int main() try
{
    Person p("Goofy","tom",53);
    vector <Person> vp;
    for(int i=0; i<5; i++) {
        cin>>p;
        vp.push_back(p);
    }

    for(int i=0; i<vp.size(); i++)
        cout << vp[i] << endl;

    return 0;
}

catch(exception& e) {
    cerr << e.what();
    return 0;
}
catch(...) {
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

错误与int main()(2)之后的第2行有关,Person p("Goofy","tom",53);但我不知道为什么strings会出错!

这是错误:http://i59.tinypic.com/v487sw.png

Bor*_*der 5

i<f_n.size() || i<s_n.size()
Run Code Online (Sandbox Code Playgroud)

应该

i<f_n.size() && i<s_n.size()
Run Code Online (Sandbox Code Playgroud)

否则你就不在其中一个字符串上了.例如,如果f_n长度为3,s_n则长度为5 3 < 3 || 3 < 5将评估为true,并且您将索引f_n[3]哪个超出范围.

PS:实际上虽然您可能想要将检查提取到函数中并分别在两个字符串上循环,否则将不会完全检查两个字符串中最长的字符串.