# code from my book

## Recommended Posts

Nanook    537
Why doesnt this code work? It compiles.. but under runtime I get a error.. the "report this problem" error. The code is from a book.. It should be correct from the book..
#include <string>
#include <iostream>
#include <cctype>
#include <vector>

using std::cout;
using std::cin;
using std::string;
using std::vector;
using std::endl;

vector<string> split(const string& s)
{
vector<string> ret;
typedef string::size_type string_size;
string_size i = 0;

while (i != s.size()) {
while (i != s.size() && isspace(s[i]))
++i;

string_size j = i;

while (j != s.size() && !isspace(s[j]))
++j;

if (i != j) {
ret.push_back(s.substr(i, j - i));
i = j;
}
}
}

int main()
{
//ask for and stores a string in s1.
cout << "Pleas enter a string:";
string s;

while (getline(cin, s)) {
vector<string> v = split(s);

for (vector<string>::size_type i = 0; i != v.size(); ++i)
cout << v[i] << endl;
}
return 0;
}



##### Share on other sites
daviangel    604
Since this is C++ if you are getting runtime error most likely your program is accessing memory it shouldn't be.
Also you should use the exact compiler mentioned in your book since even slight deviations will cause another compiler to act completely different with the same code since not all compilers comply exactly with the C++ standard.

##### Share on other sites
superkent    158
I looked at your code in Dev-C++. It looks like you need to actually return the vector you are working with in your split function. When I did that it seemed to work.

*Edit
I dont get the error anymore, but you seem to still have a problem with your input stream. You dont need your getline in a while loop, it will grab the whole line until a new line if I remember right.

return ret;

to the end of the function.

##### Share on other sites
SirSmokey    229
Well from the code you've posted it shouldn't even compile.

Your split() function has a return type of vector<string> but your funtion dosen't return anything. I assume that the variable "ret" is what is suppose to be returned.

Try adding return ret; at the end of the split function.

PS: after the change to the split function I ran your program without any problem. However you should add a way to quit the app (IE exiting the loop, not just having to hit the close button).

EDIT: beat.

##### Share on other sites
Zahlman    1682
Quote:
 Original post by SirSmokeyWell from the code you've posted it shouldn't even compile.Your split() function has a return type of vector but your funtion dosen't return anything. I assume that the variable "ret" is what is suppose to be returned.Try adding return ret; at the end of the split function.

Unfortunately, such things do compile (from my experience), and many compilers have a bad habit of not including this problem in the default warnings, either. :(

##### Share on other sites
Hows about changing your isspace to std::isspace because you are including <cctype> and not <ctype.h>

or you can do
using std::isspace;

Cheers ;-)

Edit: Oops, just read it was a runtime error

I am suprised it compiled... I would have thought that all the functions would be packaged inside the std namespace and typing isspace would be outside the std namespace.

##### Share on other sites
Nanook    537
aha.. return ret; .. probably forgot to write it of the code in the book.. thanks! I'll try it when I get back from work!

I use dev-c++