splitting a string

This is a discussion on splitting a string within the C++ Programming forums, part of the General Programming Boards category; Hey guys. This is my first time doing anything like this so please don't be too harsh on me. So, ...

  1. #1
    Registered User
    Join Date
    Nov 2010
    Posts
    8

    splitting a string

    Hey guys. This is my first time doing anything like this so please don't be too harsh on me. So, I am trying to write a shell. The first step is to take the users input command and split it up into arguments.

    So this is what I've got:

    [tag]
    Code:
    void parse(string something)
    {
    	int cnt = 0;
    	char *argv[11];
    	string val, part;
    	stringstream unit(something);
    
    	while(getline(unit, val, ' ') && cnt < 10)
    	{
    		part = val;
    		argv[cnt]  = (char*)part.c_str();
    		cnt++;
    	}
    
    	argv[cnt] = NULL;
    }
    [/tag]

    So, I want the method to take the string and split it into parts. The delimiter is an empty space between words. Then, I want it to take each part and throw it into the *argv[]. After its got all the parts the very last part put into the array should be followed by a NULL. Seems alright logically to me.

    But, if I were to put in a for loop to read through the array the result I get is not at all what I want.

    For example if I put in "This is my world" and appended this for loop to the end of that method:

    [tag]
    Code:
    for(int i = 0; argv[i] != NULL; i++)
            cout << argv[i] << endl;
    
                            OR
    
    for(int i = 0; i < cnt; i++)
            cout << argv[i] << endl;
    [/tag]

    I should get this as an output:

    This
    is
    my
    world

    But, in most cases I might get the last 3 lines but the first one will be empty. In others the words will get mixed up or there will be doubles even though i did not put a particular word in my input multiple times. I don't understand why this happens. Any help would be appreciated.

  2. #2
    Registered User whiteflags's Avatar
    Join Date
    Apr 2006
    Location
    United States
    Posts
    6,829
    The most suspect line is the c_str() call, so let's look at the internet for answers. From the reference manual:

    const char* c_str ( ) const;

    Get C string equivalent
    Generates a null-terminated sequence of characters (c-string) with the same content as the string object and returns it as a pointer to an array of characters.

    A terminating null character is automatically appended.

    The returned array points to an internal location with the required storage space for this sequence of characters plus its terminating null-character, but the values in this array should not be modified in the program and are only granted to remain unchanged until the next call to a non-constant member function of the string object.
    So there is your problem.

    part = val; actually seems to be the line that removes the guarantee (since overloaded operators, especially assignment, are actually member functions dressed up in syntax).
    Quote Originally Posted by phantomotap
    Can you write code while blindfolded only with the blind covering your brain? Can you code while brainfolded?

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. OOP Question DB Access Wrapper Classes
    By digioz in forum C# Programming
    Replies: 2
    Last Post: 09-07-2008, 04:30 PM
  2. String splitting algorithm help
    By (TNT) in forum C++ Programming
    Replies: 7
    Last Post: 05-12-2007, 11:28 AM
  3. Classes inheretance problem...
    By NANO in forum C++ Programming
    Replies: 12
    Last Post: 12-09-2002, 02:23 PM
  4. creating class, and linking files
    By JCK in forum C++ Programming
    Replies: 12
    Last Post: 12-08-2002, 01:45 PM
  5. Warnings, warnings, warnings?
    By spentdome in forum C Programming
    Replies: 25
    Last Post: 05-27-2002, 06:49 PM

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21