c++ - 致命字符串错误

标签 c++ string text vector

对于学校实验室,我必须接收电子邮件输入并输出“@”前的用户名和站点类型。网站类型可以是地址的最后三个字母(com 代表商业企业,edu 代表教育机构等),也可以是国家/地区缩写的最后两个字母(us 代表美国,等等)。在处理两个字母的国家/地区代码网站类型时,我输入了一个文本文件 (countries.txt),其中每个国家/地区代码在每一行中都有其各自的国家/地区。我已经完成了我的代码,但是当我运行我的代码并输入包含三个字母站点类型(com、org 等)的电子邮件时,它工作正常。但是当我运行我的代码并在末尾输入一个带有两个字母站点类型的电子邮件时,它是国家代码的缩写,我得到一个致命的字符串错误。我试过在处理两个字母的国家代码电子邮件地址时调用的 else if 循环中到处寻找,但是当我超出字符串范围时我找不到。感谢您的帮助!

#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

最佳答案

countries 为空 vector ,使用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";
                }
            }
        }
    }
}

关于c++ - 致命字符串错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34702578/

相关文章:

html - 渐变斜体?

c++ - 在菜单中放置登录功能 (C++)

c++ - 不清楚的 typedef 类型

java - 在不使用集合的情况下重复字符串中的单词

c - 读取字符串 C - Linux

c++ - 删除存储在字符串中的重复行

c++ - 无法从我的 C++ 应用程序获得输出

c++ - "A matching symbol file was not found in this folder "。当我尝试使用转储文件进行调试时出现此错误

audio - 如何将下载的视频文件转换为文本文件

batch-file - 批处理脚本 - 在目录中的多个文件中查找和替换文本