Config string parse to select user-entered strings.

bakatu's Avatar, Join Date: Sep 2007
Newbie Member
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.

Last edited by shabbir; 3Sep2007 at 08:59.. Reason: Code block and not Color code.
0
jwshepherd's Avatar, Join Date: Aug 2007
Team Leader
it might be easier to describe the inuts you are getting and what you want the outputs to be
0
bakatu's Avatar, Join Date: Sep 2007
Newbie Member
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

//this is the error
           std::istringstream buffer(text);
//this is the error

           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------------------------------

Last edited by shabbir; 4Sep2007 at 08:23.. Reason: Code block - http://www.go4expert.com/forums/misc.php?do=bbcode#code
0
DaWei's Avatar, Join Date: Dec 2006
Team Leader
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.
0
shabbir's Avatar, Join Date: Jul 2004
Go4Expert Founder
Code block