对于学校实验室,我必须接收电子邮件输入并输出“@”之前的用户名和网站类型。站点类型是地址的最后三个字母(商业企业的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
答案 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_of
和substr
,使用它们而不是浏览字符。
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";
}
}
}
}
}