当输入一个没有空格的名称时,它表示' std :: out_of_range'

时间:2018-02-20 20:48:24

标签: c++ string

我应该输入一个名字。如果这个名字没有空格我想要打印名称,直到它有两个空格,如果它有1个空格,我想再打印一个姓氏。

例如,如果我输入Sara,我会收到此错误:

  

在抛出' std :: out_of_range'的实例后终止调用     what():basic_string :: substr:__ post(18446744073709551615)>这个 - "> size()(即4)

int SpaceCounter=0;
for(int i=0;i<=name.length();i++)
{
  if(name[i] == ' ')
  {
    SpaceCounter++;
  }
}
if(SpaceCounter>=2)
{
cout<< name;
}
else if(SpaceCounter=1)
{

    size_t pos = name.find(" ");
    string str3 = name.substr (pos);  
    cout <<name<<str3;
    //break;

}
else if(SpaceCounter=0)
{
  for(int i=0;i<2;i++)
  {
    cout <<name<<" ";
  }
}

2 个答案:

答案 0 :(得分:0)

我认为你是以错误的方式做到的。您可以在找到它们时删除其他空格。您还应该注意条件中的单=。这是一个更好的版本:(未经测试)

void f(const std::string& name) {
    unsigned spaces = 0;
    std::string out;
    for(unsigned i = 0; i < name.length(); i++)
        if(name[i] == ' ') {
            if(spaces == 0)
                // allow one space
                out += name[i];
            spaces++;
        } else 
            out += name[i];
    }
    if(spaces == 0)
        // no spaces found, print 2 times
        std::cout << out << ' ' << out << std::endl;
    else
        std::cout << out << std::endl;
}

答案 1 :(得分:0)

问题在于:

for(int i=0;i<=name.length();i++)

<=更改为<。正如所写,它运行在字符串的末尾,这是异常告诉你的。