Reputation: 103
I'm writing a program for my class that'll sort a list of albums by the albums name and then the albums songs in alphabetical order. I'm getting the error 'std::out_of_range' what(): basic_string::substr: __pos (which is 4) > this->size() (which is 0). My teacher kind of just threw this at us without explaining much so I'm stuck. This is the code I have so far:
#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]);
}
}
}
And the input data is a list of albums with the release date, genre, and songs:
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)
Upvotes: 5
Views: 46480
Reputation: 829
Here problem is with your substr()
call. It looks like you are passing substr()
parameter (Position of the first character to be copied as a substring) greater than string length.
If this parameter is greater than the string length, only then does it throw an out_of_range. exception which you are getting in your code.
To avoid this make sure you are passing valid value to substr()
call.
Also, you should accept the input data first before performing this sorting/swapping operation else program may terminate after throwing exception.
For ex. your code needs the value of count at if
statement to work properly.If you don't provide any value then it will take garbage value like 4195901
and if
statement will throw following exception when i
reaches to 12
(because songs is an array of 12
strings in your code):
terminate called after throwing an instance of 'std::length_error' what(): basic_string::_S_create Aborted
I hope this will help you.
Upvotes: 6
Reputation: 1980
Problem is in the song Home of the albumn Walk, Don'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().
Upvotes: 3