'std :: out_of_range'what():basic_string :: substr:__ post

时间:2014-12-01 05:53:02

标签: c++ arrays struct

我正在为我的班级编写一个程序,按照专辑名称排序专辑列表,然后按字母顺序对专辑歌曲进行排序。我收到了错误' std :: out_of_range' what():basic_string :: substr:__ post(4)> this-> size()(为0)。我的老师只是把它扔给我们而没有多解释,所以我被困住了。这是我到目前为止的代码:

#include <iostream>
#include <string>

using namespace std;

struct album
 {
    string name;
    string release;
    string genre;
    string songs[12];
    int count;
 };

int main()
 {
  album albums[4];
        for (int an = 0; an < 3; an++)
      {
            for (int i = 0; i < albums[an].count-1; i++)
              {

                    if (albums[an].songs[i].substr(4) > albums[an].songs[i+1].substr(4))
                      {
                            swap (albums[an].songs[i], albums[an].songs[i+1]);
                      }
              }
      }

输入数据是包含发行日期,流派和歌曲的专辑列表:

Walk, Don't Run 
Released 1960
Genre    Instrumental rock, Surf
 1. Morgen
 2. Raunchy
 3. Home
 4. My Own True Love (Tara's Theme)
 5. The Switch
 6. Walk, Don't Run
 7. Night Train
 8. No Trespassing
 9. Caravan
10. Sleepwalk
11. The McCoy
12. Honky Tonk
================================== 
Another Smash!!!  
Released 1961
Genre    Surf rock 
 1. (Ghost) Riders in the Sky (2:28)
 2. Wheels (1:55)
 3. Lonely Heart (2:10)
 4. Bulldog (2:20)
 5. Lullaby of the Leaves (1:58)
 6. Beyond the Reef (3:05)
 7. Raw-Hide (2:29)
 8. Meet Mister Callahan (2:20)
 9. Trambone (2:04)
10. Last Date (2:13)
11. Ginchy (1:40)
12. Josie (2:04)
================================== 
The Ventures Play Telstar and the Lonely Bull
Released 1963
Genre    Surf rock 
 1. Telstar (2:37)
 2. The Lonely Bull (2:11)
 3. Mexico (2:26)
 4. Calcutta (2:20)
 5. Apache (3:08)
 6. Never on Sunday (2:14)
 7. Tequila (2:44)
 8. Green Onions (2:05)
 9. Percolator (2:14)
10. Red River Rock (2:15)
11. Let There Be Drums (2:20)
12. Last Night (2:29)
================================== 
Hawaii Five-O 
Released 1969
Genre    Instrumental
 1. Hawaii Five-O (1:59)
 2. Lovin' Things (2:31)
 3. Galveston (2:40)
 4. The Letter (2:10)
 5. Don't Give in to Him (2:12)
 6. Theme from A Summer Place (2:16)
 7. Medley: Spooky/Traces/Stormy (4:25)
 8. Medley: Aquarius/Let the Sunshine In (2:49)
 9. Games People Play (2:46)
10. I Can Hear Music (2:37)
11. Dizzy (2:31)

2 个答案:

答案 0 :(得分:2)

此问题与您的substr()电话有关。看起来您传递的substr()参数(要复制的第一个字符的位置作为子字符串)大于字符串长度。

如果此参数大于字符串长度,则只会抛出您在代码中获得的 out_of_range。异常。

为避免这种情况,请确保将有效值传递给substr()来电。

此外,在执行此排序/交换操作之前,您应首先接受输入数据,否则程序可能会在抛出异常后终止。

对于前。您的代码需要if语句处的count值才能正常工作。如果您没有提供任何值,那么它将占用像4195901这样的垃圾值,if语句会抛出以下内容i到达12时的异常(因为歌曲是代码中12个字符串的数组):

  

在抛出&#39; std :: length_error&#39;的实例后终止调用     what():basic_string :: _ S_create   中止

我希望这会对你有所帮助。

答案 1 :(得分:0)

问题发生在专辑的歌曲主页 Walk,Don#39; t Run

Walk, Don't Run 
Released 1960
Genre    Instrumental rock, Surf
1. Morgen
2. Raunchy
3. Home //In this line song length is 4 ie. 0 to 3 
        //if you do substr(4) then it will throws 'std::out_of_range'.
        //So check the length of the song before substr().