Search code examples
c++stringlinked-listmixing

String subscript out of range in line 1331 of xstring


The second while loop is throwing an exception in xstring line 1441 on the second iteration, which it should not do. This is because on the first pass:

Testthis->NAME[n] = 'B'
Testthis->NAME[n+1] = 'O'
Testthis->NAME = "BOD MQL"

are all verified from the debug cout statements. I am stumped on this one.

struct Node * ProbableMatch(struct Node * Look_in, int MaxNodes, char Findthis[64]){
system("cls");
int i=0,proba=100,CurrentHigh=100;
size_t pos1=1,n1=0,n2=0,pos2=1;
//char s[64];
struct Node * CurrentHighProb;
struct Node * Testthis;
CurrentHighProb=new(Node);
Testthis=new(Node);
Testthis=Look_in;
//for(i=0;i==MaxNodes;i++)
while(!Testthis || i!=ccounter)
{
    gotoxy(0,0);
    int n=0;
    n1=sizeof(Look_in->NAME);
    n2=sizeof(Findthis);
    string str1;
    char str2[64];
    cout<<Testthis->NAME[n]<<endl<<Testthis->NAME<<endl;
    cout<<Testthis->NAME[n+1]<<endl;

    while(Testthis->NAME[n]!='\0'){  //mannually coverts the strings since I am having hell with the inbuilt functions
        cout<<Testthis->NAME[n];
        str1[n]=Testthis->NAME[n];
        if(Testthis->NAME[n+1]=='\0'){str1[n+1]='\0';}//makes NULL terminated strings
        n++;
    }//end of while

    //strcpy_s(cstr, str1.length());
    //strcpy_s(str1,sizeof(Look_in->NAME),Look_in->NAME);
    //strcpy_s(str2,sizeof(Findthis),Findthis);
    //char * cstr1 = new char[str1.length()+1];
    cout<<str1.compare(pos1,n1,Findthis,0,n2)<<" is the value of the string compare "<<endl;
    proba=str1.compare(pos1,n1,Findthis,0,n2);//compares Findthis to the varibles read from the database from string matches

    //DEBUG STUFF
    cout<<endl<<sizeof(Look_in->NAME)<<" sizeof(Look_in->NAME)"<<Look_in->NAME<<endl;
    cout<<sizeof(Findthis)<<" sizeof(Findthis)"<<Findthis<<endl;
    cout<<sizeof(str1)<<" "<<str1<<" string1   string2 "<<str2<<" "<<sizeof(str2)<<endl;
    //cout<<sizeof(str1)<<" reinterpret_cast< char *>(str1)"<<endl;
    system("PAUSE");
    cout<<"\n Probability of "<<Look_in->NAME<<" matching "<<Findthis<<" is "<<proba<<" ."<<endl;
    //ENDOFDEBUG FOR FUNCTION
    Testthis->prob=proba;
    if(proba==0)
    {
        cout<<"proba equals zero, match found returning "<<Look_in<<endl;
        //delete[] cstr1;
        return Testthis;  // returns the pointer of the varible that best matched the search
    }
    if(proba<CurrentHigh){
        CurrentHigh=proba;
        CurrentHighProb=Testthis;
    }
    i++;
    Testthis=Testthis->next;
}
cout<<"Perfect match not found after "<<i<<" number of searches, returning this highest probable match "<<CurrentHighProb<<" "<<proba<<endl;

system("PAUSE");
//delete[] cstr1;
return CurrentHighProb;
}

Solution

  • string str1;
    

    declares a zero-length std::string.

    str1[n]=Testthis->NAME[n];
    

    references the (non-existent) n'th element of str1.

    Perhaps you mean to create a string with a definite length:

    string str1(n1, ' ');
    

    Or, perhaps you mean to allocate the string data during the copy:

    str1.push_back(Testthis->NAME[n]);
    

    There are other errors in your code, but this one likely produced the exception you describe.

    You can avoid all of these errors simply. Replace the inner while loop with this:

    str1 = Testthis->NAME;