I am trying to parse a user-entered string and separate it at all the spaces, but I don't know how to change the parameters to accept user-entered strings, just what string is programmed in for the string already. I did not create this code, but I am trying to modify it to work like I want it to, so don't ask me the how the whole thing works. Here is the code I am working on: Code: //parser class-------------------------------------------- class parser { std::string text; public: static const int max_field_size=100; explicit parser(const char *s) : text(s) {} void tokenize(char *fields[], int nf, const char breaker=' ') { // parses internal string, breaking at instances of <breaker> // which are thrown away. Returns separated values as fields std::istringstream buffer(text); int f=0; while (f<nf) { buffer.getline(fields[f], max_field_size, breaker); ++f; } } }; //end of parser class-------------------------------------- int main() { ... cin >> string s; parsef(s); ... } //string parsing Function---------------------------------- void parsef(string s) { const char* userstring="RUN filename and this\n"; char **fields = new char*[3]; for (int i=0; i<3; ++i) fields[i]=new char[parser::max_field_size]; parser parse(userstring); parse.tokenize(fields, 3); for (int i=0; i<3; ++i) cout << "word " << i << ": " << fields[i] << endl; } //end string parsing Function------------------------------ Only what I put in for 'userstring' is parsed. I don't know how to get the string I pass to the parse function to be the string parsed. I thinking it's something simple to do, but I just can't figure it out. Could someone help, please? And thanks.
Like the old code says, the input is: const char* userstring="RUN filename and this\n"; which is only "RUN filename and this". The output of that is: RUN filename and this I want to enter my own string, not what already is in the code, and have that parsed at the spaces. Ex: when prompted for a string when the program is running, I type: "Hello I typed this" Output: Hello I typed this I hope that clears that up. ------------------------------------------------- Updated: I have most of the parser figured out, but I am getting an error on this line: std::istringstream buffer(text); error: variable `std::istringstream buffer' has initializer but incomplete type I don't know what' wrong with the type, so could someone help me with that? Here's the new code: Code: #include <iostream> #include <string> using namespace std; //---------------------paerser class-------------------------------------------- class parser { std::string text; public: static const int max_field_size=100; explicit parser(const char *s) : text(s) {} void tokenize(char *fields[], int nf, const char breaker=' ') { // parses internal string, breaking at instances of <breaker> // which are thrown away. Returns separated values as fields [COLOR=DarkOliveGreen]//this is the error[/COLOR] std::istringstream buffer(text); [COLOR=DarkOliveGreen]//this is the error[/COLOR] int f=0; while (f<nf) { buffer.getline(fields[f], max_field_size, breaker); ++f; } } }; //---------------------end of parser class-------------------------------------- void parsef(string s); int main() { string myString; cout << "Enter a string: "; getline(cin, myString); parsef(myString); return 0; } void parsef(string s) { char **fields = new char *[3]; for (int i = 0; i < 3; ++i) fields[i] = new char[parser::max_field_size]; parser parse(s.c_str()); for (int i = 0; i < 3; i++) { delete [] fields[i]; } delete fields; } //end string parsing Function------------------------------
Put your code in code tags. If you don't know what that means, read the "Before you make a query" thread. Also, some Visine would be good to get the red out.