Solved

strtok() woes.... How to separate out when two delims are right next to each other?

Posted on 2009-05-07
8
460 Views
Last Modified: 2012-05-06
Hi all,

I am having problems with strtok(). What I want is to get back an empty char when two delims are right next to each other. See my code for example..

I want:
paramPointers[0] = "toaster"
paramPointers[1] = "oven"
paramPointers[2] = "sink"
paramPointers[3] = ""
paramPointers[4] = ""
paramPointers[5] = "television"
paramPointers[6] = "stove"
paramPointers[7] = "fridge"

but what I am getting is:

paramPointers[0] = "toaster"
paramPointers[1] = "oven"
paramPointers[2] = "sink"
paramPointers[3] = "television"
paramPointers[4] = "stove"
paramPointers[5] = "fridge"
paramPointers[6] = nil
paramPointers[7] = nil
char delims[5] = "";

	strcpy(delims, "|");
 

	strcpy(receiveResponse, "toaster|oven|sink|||television|stove|fridge");

	

	receiveTok = strtok(receiveResponse, delims);

	

	while(receiveTok != NULL && iToken < MAX_PARAMS)

	{

		paramPointers[iToken] = receiveTok;

		

		iToken++;

		receiveTok = strtok (NULL, delims);

	}

Open in new window

0
Comment
Question by:ehensens
  • 4
  • 2
  • 2
8 Comments
 
LVL 53

Expert Comment

by:Infinity08
Comment Utility
strtok already treats multiple separator characters as one. So, I'm not sure what the question is.
0
 
LVL 40

Accepted Solution

by:
evilrix earned 250 total points
Comment Utility
If you read the description for how strtok works I think you'll see why this isn't doing what you want.

"To determine the beginning and the end of a token, the function first scans from the starting location for the first character not contained in delimiters (which becomes the beginning of the token). And then scans starting from this beginning of the token for the first character contained in delimiters, which becomes the end of the token."

http://www.cplusplus.com/reference/clibrary/cstring/strtok/
0
 

Author Comment

by:ehensens
Comment Utility
Hi evilrix,

So are you confirming that my code as is will not do what I want, just by the nature of strtok(), i.e. "||" will always be seen as "|"?
0
 
LVL 53

Assisted Solution

by:Infinity08
Infinity08 earned 250 total points
Comment Utility
Ah, sorry, you DON'T want it to treat multiple separators as one.

Then you can't use strok :) You'll have to write your own tokenizer for that.
0
Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

 
LVL 40

Expert Comment

by:evilrix
Comment Utility
Try this, it should do what you are looking to do with strtok.
#include <string>

#include <vector>

#include <sstream>
 

#define MAX_PARAMS 25
 

int main()

{

	std::string receiveResponse = "toaster|oven|sink|||television|stove|fridge";

	std::vector<std::string> params;
 

	std::stringstream ss(receiveResponse);

	std::string s;
 

	while(std::getline(ss, s, '|'))

	{

		params.push_back(s);

	}

}

Open in new window

0
 
LVL 40

Expert Comment

by:evilrix
Comment Utility
^^^ I say should because I didn't test it very well :)
0
 

Author Comment

by:ehensens
Comment Utility
So, then how would I get from params to a type:

    char* parameters[MAX_PARAMS];


0
 
LVL 40

Expert Comment

by:evilrix
Comment Utility
You don't... you use vector. There is no need to use the unsafe fixed array construct in C++.
http://www.cplusplus.com/reference/stl/vector/

If you need something that can be used in place of char* parameters[MAX_PARAMS]; you can use

char* parameters = &params[0];

However, please note this is only valid as long as no mutating functions (non-const) are called on vector and you do NOT delete[] on this pointer as it is managed by vector.
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
C++ Properties One feature missing from standard C++ that you will find in many other Object Oriented Programming languages is something called a Property (http://www.experts-exchange.com/Programming/Languages/CPP/A_3912-Object-Properties-in-C.ht…
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.

728 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now