程序终止于索引超出范围

时间:2018-04-27 09:22:27

标签: c++ string

我必须编写一个程序,接受字符串输入并输出没有特殊字符的排序字符串,但它会抛出索引超出范围异常,即使循环只运行到字符串结尾

#include <iostream>
#include <string.h>
using namespace std;
int main(){
    string mes="";
    string tem;
    cin>>tem;
    for (int i=0;i<tem.length();i++){
        char ch=tem.at(i);
        if((ch<=65&&ch<=90)||(ch>=97&&ch<=122))
            mes+=ch;
        else
            continue;
    }
    cout<<mes;
    for(int i=0;i<tem.length();i++){
        int small=(int)mes.at(i);
        int spos=i;
        for(int j=i;j<tem.length();j++){
            int a=(int)mes.at(j);
            if(a<small){
                small=a;
                spos=j;
            }
        }
        char temp=' ';
        temp=mes.at(i);
        mes.at(i)=mes.at(spos);
        mes.at(spos)=temp;
    }
    cout<<mes;
}

以下是错误消息:

  

终止'std :: out_of_range'what():basic_string :: at:__n(即3)&gt; = this-&gt; size()(即3)

2 个答案:

答案 0 :(得分:1)

for(int i=0;i<tem.length();i++){
    int small=(int)mes.at(i);

您迭代tem的索引,但请阅读尺寸不同的mes

答案 1 :(得分:0)

您可能需要先修正

if((ch<=65&&ch<=90)||(ch>=97&&ch<=122))

to

if(( ch >= 65 && ch <= 90) || ( ch >= 97 && ch <= 122))

第二: 第二个字符串(mes)的大小将始终小于第一个字符串(tem)的大小。但是在第二个循环中,您使用i来浏览第二个字符串(mes),这会导致out of range异常。