Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I am writing a program that allows the user to enter a sentence which then gets stored in a string and then the program will remove any full stops in the sentence and then create a list of each individual word in the string before outputting that list to the console.

the program is working perfectly as long as there is only 1 full stop in the sentence but if there are any more than that it throws this exception:

Unhandled exception at at 0x7696B727 in Project6.exe: Microsoft C++ exception: std::out_of_range at memory location 0x0022F8B8.

and then if I continue to run it it throws:

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

any suggestions? (and before anyone asks, i know you usually only have 1 full stop in a sentence but i need to do it with more than 1 as part of testing.

here is the code:

 #include <iostream>
 #include <string>

 using namespace std

 string sSentence; // sets up a string variable called sSentence

 int i = 0;

 void RemoveFullStop()
 {
    while(sSentence.find (".") != string::npos) // the program runs this loop until it cannot            find any more full stops in the string
{
        i = sSentence.find("." , i); // find the next full stop in the string and get the      character count of the space and place it in the variable i
        sSentence.replace(i,1,""); // remove the full stop
    }
}

void ListWords()
{
    while(sSentence.find (" ") != string::npos) // the program runs this loop until it cannot find any more spaces in the string
    {
        i = sSentence.find(" " , i); // find the next space in the string and get the character count of the space and place it in the variable i

        // cout << i << endl; // output the contents of iWordSpace to the console (used for debugging - no longer used)

        sSentence.replace(i,1,"
");

        // cout << sSentence << endl; // output the contents of iWordSpace to the console (used for debugging - no longer used)

        }
    }

   int main()
   {
        getline(cin, sSentence); // get user input and store it in sSentence (using the getline     function so the .find operation works correctly)

        RemoveFullStop(); // calls the RemoveFullStop void function that removes all full stops from the string

        ListWords(); // calls the ListWords void function that splits the string into a list of words

        cout << endl; // formatting line
        cout << "The words that were in the sentence were:" << endl;
        cout << endl; // formatting line
        cout << sSentence << endl;
        cout << endl; // formatting line

    system("pause");

    return 0;
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
172 views
Welcome To Ask or Share your Answers For Others

1 Answer

The problem is that you keep re-using i, in both RemoveFullStop and ListWords.

i only ever increases, and so eventually it can get past the end of the string.

You really shouldn't need a global i variable at all, to do this task.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...