1. We have moved from vBulletin to XenForo and you are viewing the site in the middle of the move. Though the functional aspect of everything is working fine, we are still working on other changes including the new design on Xenforo.
    Dismiss Notice

Config string parse to select user-entered strings.

Discussion in 'C' started by bakatu, Sep 3, 2007.

  1. bakatu

    bakatu New Member

    Joined:
    Sep 3, 2007
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    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 a moderator: Sep 3, 2007
  2. jwshepherd

    jwshepherd New Member

    Joined:
    Aug 13, 2007
    Messages:
    135
    Likes Received:
    0
    Trophy Points:
    0
    Occupation:
    VP Technology Corporation
    Location:
    Texas
    Home Page:
    it might be easier to describe the inuts you are getting and what you want the outputs to be
     
  3. bakatu

    bakatu New Member

    Joined:
    Sep 3, 2007
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    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------------------------------
     
    Last edited by a moderator: Sep 4, 2007
  4. DaWei

    DaWei New Member

    Joined:
    Dec 6, 2006
    Messages:
    835
    Likes Received:
    5
    Trophy Points:
    0
    Occupation:
    Semi-retired EE
    Location:
    Texan now in Central NY
    Home Page:
    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.
     
  5. shabbir

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,276
    Likes Received:
    364
    Trophy Points:
    83

Share This Page