C++ 为什么我会得到这个超出范围的错误

C++ 为什么我会得到这个超出范围的错误,c++,string,debugging,c++11,io,C++,String,Debugging,C++11,Io,我有一个包含一组数字的文件,例如20。该文件的内容是社会保险号码,我试图删除每个“-”。尽管在浏览文件时,我收到了以下错误 libc++abi.dylib:以std::out_of_range:basic_string类型的未捕获异常终止 这是密码 string str; ifstream inFile (fName); //fName= name of the file if (inFile.is_open()) { while ( getline (inFile,str) )

我有一个包含一组数字的文件,例如20。该文件的内容是社会保险号码,我试图删除每个“-”。尽管在浏览文件时,我收到了以下错误

libc++abi.dylib:以std::out_of_range:basic_string类型的未捕获异常终止

这是密码

string str;
ifstream inFile (fName);
//fName= name of the file
if (inFile.is_open())
{
    while ( getline (inFile,str) )
    {

        cout << str << endl;
        str.erase(3,1);//erasing first '-'
        str.erase(5,1);//erasing second '-'
        cout << str << endl;
    }
    inFile.close();
}

else
    cout << "Unable to open file";
string-str;
ifstream infle(fName);
//fName=文件名
if(infle.is_open())
{
while(getline(infle,str))
{

我建议您在代码中添加一些检查,这样您就不会假设有两个
'-'
s可以找到它们

if ( str.size() >= 4 && str[3] == '-' )
{
   str.erase(3,1);
   if ( str.size() >= 6 && str[5] == '-' )
   {
      str.erase(5,1);
   }
   else
   {
      std::cout << "Did not find a '-' at the 6-th position of the string.\n";
      std::cout << str << std::endl;
   }
}
else
{
   std::cout << "Did not find a '-' at the 4-th position of the string.\n";
   std::cout << str << std::endl;
}
if(str.size()>=4&&str[3]='-')
{
str.erase(3,1);
如果(str.size()>=6&&str[5]='-')
{
str.erase(5,1);
}
其他的
{

std::cout我建议在代码中添加一些检查,这样您就不会假设有两个
'-'
可以在其中找到它们

if ( str.size() >= 4 && str[3] == '-' )
{
   str.erase(3,1);
   if ( str.size() >= 6 && str[5] == '-' )
   {
      str.erase(5,1);
   }
   else
   {
      std::cout << "Did not find a '-' at the 6-th position of the string.\n";
      std::cout << str << std::endl;
   }
}
else
{
   std::cout << "Did not find a '-' at the 4-th position of the string.\n";
   std::cout << str << std::endl;
}
if(str.size()>=4&&str[3]='-')
{
str.erase(3,1);
如果(str.size()>=6&&str[5]='-')
{
str.erase(5,1);
}
其他的
{

std::你确定
str
的内容正确吗?@Mikejones Do a
cout@vsoftco其工作正常,甚至输出所有文件内容。它一完成就崩溃。例如,在循环开始和结束时添加cout,前几个输出是.500-18-7127 500187127 053-54-3256 053543256耶哟你需要输出在它不起作用时的
str
。使用调试器。@Mike jones:你正在“超出范围”错误,因为您超出了
str
范围。很明显,您的输入文件除了包含有效的SSN之外还包含其他内容。它还包含比SSN短的字符串,这就是为什么会出现此错误。很可能,您的输入文件以一行或多行空行结尾(生成长度为零的字符串),这正是它崩溃的原因。你确定
str
的内容正确吗?@Mikejones Do a
cout@vsoftco其工作正常,甚至输出所有文件内容。它只会在完成时崩溃。例如,在循环开始和结束时添加cout,前几个输出是.500-18-7127 500187127053-54-3256 053543256是的,你需要输出在它不起作用时的
str
。使用调试器。@Mike jones:你正在“超出范围”错误,因为您超出了
str
范围。很明显,您的输入文件除了包含有效的SSN之外还包含其他内容。它还包含比SSN短的字符串,这就是为什么会出现此错误。很可能,您的输入文件以一行或多行空行结尾(生成长度为零的字符串),这正是它崩溃的原因。谢谢,真的很有帮助。只是出于好奇,为什么我们要检查str.size()是否大于等于4?@Mikejones,
str.erase(3,1)
将尝试删除字符串第4位的字符。除非字符串的大小为4或更大,否则调用它没有意义。谢谢,真的很有帮助。只是出于好奇,我们为什么要检查str.size()是否大于等于4?@Mikejones,
str.erase(3,1)
将尝试删除字符串第4位的字符。除非字符串的大小为4或更大,否则调用它没有意义。