e7kim
e7kim

Reputation: 59

Fatal string error

For a school lab I have to take in an email input and output the username before '@' and the site type. The site type is either the last three letters of the address (com for commercial ventures, edu for educational institutions, etc) or the last two letters that are abbreviations of the country (us for united states, etc). When dealing with two letter country code site types, I inFile a text file (countries.txt) that has each country code with its respective country in each line. I have finished my code but when I run my code and inputting an email with a three letter site type (com, org, etc) it works fine. But when I run my code and input an email with a two letter site type at the end that abbreviates for a country code, I get a fatal string error. I have tried looking everywhere in my else if loop that is called upon when dealing with the two letter country code email address, but I cannot find when I am going out of bounds with the string. Any help is appreciated!

#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];
                    }
                }
            }
        }
    }
}

The text file I include:

countries.txt (file name)

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

Upvotes: 0

Views: 131

Answers (1)

Barmak Shemirani
Barmak Shemirani

Reputation: 31599

countries is empty vector, use push_back to add new items:

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;
}

Another issue here:

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

It should be changed to

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

Because you expect countrycode to be at the beginning of the line.

std::string has a number of other functions such as find_last_of and substr, use them instead of going through the characters.

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";
                }
            }
        }
    }
}

Upvotes: 3

Related Questions