致命字符串错误

时间:2016-01-10 06:01:14

标签: c++ string text vector

对于学校实验室,我必须接收电子邮件输入并输出“@”之前的用户名和网站类型。站点类型是地址的最后三个字母(商业企业的com,教育机构的edu等)或者是国家缩写的最后两个字母(我们为美国等)。在处理两个字母的国家/地区代码网站类型时,我在文件文件(countries.txt)中包含每个国家/地区代码及其各自国家/地区的行。我已经完成了我的代码但是当我运行我的代码并输入一个三字母网站类型(com,org等)的电子邮件时,它工作正常。但是,当我运行我的代码并在末尾输入一个带有两个字母的网站类型的电子邮件时,我会收到一个致命的字符串错误。我曾尝试在我的其他地方查找处理两个字母的国家/地区代码电子邮件地址时调用的循环,但是当我超出字符串边界时我找不到。任何帮助表示赞赏!

#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <vector>

using namespace std;

void getemail(string &email);
void finduser(string email);
void findsitetype(string email);

int main()
{
    string email;

    getemail(email);
    finduser(email);
    findsitetype(email);

    system("pause");

    return 0;
}
void getemail(string &email)
{
    cout << "Please enter your email address: ";
    cin >> email;
    cout << endl;
}
void finduser(string email)
{
    int index = email.find('@');
    cout << "Username: ";
    for (int i = 0; i < index; i++)
        cout << email[i];
    cout << endl << endl;
}
void findsitetype(string email)
{
    int truesize = size(email) - 1, i = 0;
    string lastthree, countrycode, line;
    vector<string> countries;
    lastthree.resize(3);
    for (int i = 0; i < 3; i++)
    {
        lastthree[i] = email[truesize - (2 - i)];
    }
    cout << "Site type: ";
    if (lastthree == "edu")
        cout << "Educational institutions";
    else if (lastthree == "org")
        cout << "Not-for-profit organizations";
    else if (lastthree == "gov")
        cout << "Government entities";
    else if (lastthree == "mil")
        cout << "Military installations";
    else if (lastthree == "net")
        cout << "Network service providers";
    else if (lastthree == "com")
        cout << "Commercial ventures";
    else if (email[truesize - 2] == '.') //Source of my error seems to be in this else if loop.
    {
        countrycode[0] = email[truesize - 1];
        countrycode[1] = email[truesize];

        ifstream inFile("countries.txt");
        if (inFile.fail())
        {
            cout << "File not found.";
            exit(1);
        }
        else
        {
            while (getline(inFile, line)) //This is the first time I am using getline I suspect I might be misusing it.
            {
                countries[i] = line;
                i = i + 1;
            }
            inFile.close();

            for (int j = 0; j < countries.size(); j++)
            {
                string line = countries[j];
                string country;
                if (line.find(countrycode) != -1)
                {
                    int index = line.find(countrycode);
                    cout << "Country ";
                    for (int k = 5; k < line.size(); k++)
                    {
                        cout << line[k];
                    }
                }
            }
        }
    }
}

我包含的文本文件:

countries.txt(文件名)

ac : Ascension Island 
ad : Andorra 
ae : United Arab Emirates 
af : Afghanistan 
ag : Antigua and Barbuda 
ai : Anguilla 
al : Albania 
am : Armenia 
an : Netherlands Antilles 
ao : Angola 
aq : Antarctica 
ar : Argentina 
as : American Samoa 
at : Austria 
au : Australia 
aw : Aruba 
ax : Aland Islands 
az : Azerbaijan 
ba : Bosnia and Herzegovina 
bb : Barbados 
bd : Bangladesh 
be : Belgium 
bf : Burkina Faso 
bg : Bulgaria 
bh : Bahrain 
bi : Burundi 
bj : Benin 
bm : Bermuda 
bn : Brunei Darussalam 
bo : Bolivia 
br : Brazil 
bs : Bahamas 
bt : Bhutan 
bv : Bouvet Island 
bw : Botswana 
by : Belarus 
bz : Belize 
ca : Canada 
cc : Cocos (Keeling) Islands 
cd : Congo, Democratic Republic 
cf : Central African Republic 
cg : Congo 
ch : Switzerland 
ci : Cote D'Ivoire (Ivory Coast) 
ck : Cook Islands 
cl : Chile 
cm : Cameroon 
cn : China 
co : Colombia 
cr : Costa Rica 
cs : Czechoslovakia (former) 
cu : Cuba 
cv : Cape Verde 
cx : Christmas Island 
cy : Cyprus 
cz : Czech Republic 
de : Germany 
dj : Djibouti 
dk : Denmark 
dm : Dominica 
do : Dominican Republic 
dz : Algeria 
ec : Ecuador 
ee : Estonia 
eg : Egypt 
eh : Western Sahara 
er : Eritrea 
es : Spain 
et : Ethiopia 
eu : European Union 
fi : Finland 
fj : Fiji 
fk : Falkland Islands (Malvinas) 
fm : Micronesia 
fo : Faroe Islands 
fr : France 
fx : France, Metropolitan 
ga : Gabon 
gb : Great Britain (UK) 
gd : Grenada 
ge : Georgia 
gf : French Guiana 
gg : Guernsey 
gh : Ghana 
gi : Gibraltar 
gl : Greenland 
gm : Gambia 
gn : Guinea 
gp : Guadeloupe 
gq : Equatorial Guinea 
gr : Greece 
gs : S. Georgia and S. Sandwich Isls. 
gt : Guatemala 
gu : Guam 
gw : Guinea-Bissau 
gy : Guyana 
hk : Hong Kong 
hm : Heard and McDonald Islands 
hn : Honduras 
hr : Croatia (Hrvatska) 
ht : Haiti 
hu : Hungary 
id : Indonesia 
ie : Ireland 
il : Israel 
im : Isle of Man 
in : India 
io : British Indian Ocean Territory 
iq : Iraq 
ir : Iran 
is : Iceland 
it : Italy 
je : Jersey 
jm : Jamaica 
jo : Jordan 
jp : Japan 
ke : Kenya 
kg : Kyrgyzstan 
kh : Cambodia 
ki : Kiribati 
km : Comoros 
kn : Saint Kitts and Nevis 
kp : Korea (North) 
kr : Korea (South) 
kw : Kuwait 
ky : Cayman Islands 
kz : Kazakhstan 
la : Laos 
lb : Lebanon 
lc : Saint Lucia 
li : Liechtenstein 
lk : Sri Lanka 
lr : Liberia 
ls : Lesotho 
lt : Lithuania 
lu : Luxembourg 
lv : Latvia 
ly : Libya 
ma : Morocco 
mc : Monaco 
md : Moldova 
me : Montenegro 
mg : Madagascar 
mh : Marshall Islands 
mk : F.Y.R.O.M. (Macedonia) 
ml : Mali 
mm : Myanmar 
mn : Mongolia 
mo : Macau 
mp : Northern Mariana Islands 
mq : Martinique 
mr : Mauritania 
ms : Montserrat 
mt : Malta 
mu : Mauritius 
mv : Maldives 
mw : Malawi 
mx : Mexico 
my : Malaysia 
mz : Mozambique 
na : Namibia 
nc : New Caledonia 
ne : Niger 
nf : Norfolk Island 
ng : Nigeria 
ni : Nicaragua 
nl : Netherlands 
no : Norway 
np : Nepal 
nr : Nauru 
nt : Neutral Zone 
nu : Niue 
nz : New Zealand (Aotearoa) 
om : Oman 
pa : Panama 
pe : Peru 
pf : French Polynesia 
pg : Papua New Guinea 
ph : Philippines 
pk : Pakistan 
pl : Poland 
pm : St. Pierre and Miquelon 
pn : Pitcairn 
pr : Puerto Rico 
ps : Palestinian Territory, Occupied 
pt : Portugal 
pw : Palau 
py : Paraguay 
qa : Qatar 
re : Reunion 
ro : Romania 
rs : Serbia 
ru : Russian Federation 
rw : Rwanda 
sa : Saudi Arabia 
sb : Solomon Islands 
sc : Seychelles 
sd : Sudan 
se : Sweden 
sg : Singapore 
sh : St. Helena 
si : Slovenia 
sj : Svalbard & Jan Mayen Islands 
sk : Slovak Republic 
sl : Sierra Leone 
sm : San Marino 
sn : Senegal 
so : Somalia 
sr : Suriname 
st : Sao Tome and Principe 
su : USSR (former) 
sv : El Salvador 
sy : Syria 
sz : Swaziland 
tc : Turks and Caicos Islands 
td : Chad 
tf : French Southern Territories 
tg : Togo 
th : Thailand 
tj : Tajikistan 
tk : Tokelau 
tm : Turkmenistan 
tn : Tunisia 
to : Tonga 
tp : East Timor 
tr : Turkey 
tt : Trinidad and Tobago 
tv : Tuvalu 
tw : Taiwan 
tz : Tanzania 
ua : Ukraine 
ug : Uganda 
uk : United Kingdom 
um : US Minor Outlying Islands 
us : United States 
uy : Uruguay 
uz : Uzbekistan 
va : Vatican City State (Holy See) 
vc : Saint Vincent & the Grenadines 
ve : Venezuela 
vg : British Virgin Islands 
vi : Virgin Islands (U.S.) 
vn : Viet Nam 
vu : Vanuatu 
wf : Wallis and Futuna Islands 
ws : Samoa 
xk : Kosovo* 
ye : Yemen 
yt : Mayotte 
yu : Serbia and Montenegro (former) 
za : South Africa 
zm : Zambia 
zw : Zimbabwe

1 个答案:

答案 0 :(得分:3)

countries为空向量,请使用push_back添加新项目:

while (getline(inFile, line)) //This is the first time I am using getline I suspect I might be misusing it.
{
    //countries[i] = line;
    countries.push_back(line);
    i = i + 1;
}

这里的另一个问题是:

if (line.find(countrycode) != -1)

应该改为

if (line.find(countrycode) == 0)

因为您希望国家/地区代码位于该行的开头。

std::string还有许多其他功能,例如find_last_ofsubstr,使用它们而不是浏览字符。

void findsitetype(string email)
{
    size_t dot = email.find_last_of('.');
    if (dot == string::npos || dot == (email.size() - 1))
        return;

    string countrycode = email.substr(dot + 1);
    if (!countrycode.size())
        return;

    vector<string> countries;
    if (countrycode == "edu")       cout << "Educational institutions";
    else if (countrycode == "org")  cout << "Not-for-profit organizations";
    else if (countrycode == "gov")  cout << "Government entities";
    else if (countrycode == "mil")  cout << "Military installations";
    else if (countrycode == "net")  cout << "Network service providers";
    else if (countrycode == "com")  cout << "Commercial ventures";
    else if (countrycode.size() == 2)
    {
        ifstream inFile("countries.txt");
        if (inFile.fail())
        {
            cout << "File not found.";
            exit(1);
        }
        else
        {
            string line;
            while (getline(inFile, line)) 
                countries.push_back(line);
            inFile.close();
            for (size_t j = 0; j < countries.size(); j++)
            {
                if (countries[j].find(countrycode) == 0)
                {
                    line = countries[j];
                    if (line.size() > 5)
                        cout << "country: " << line.substr(5) << "\n";
                }
            }
        }
    }
}