Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 507
  • Last Modified:

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

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
ehensens
Asked:
ehensens
  • 4
  • 2
  • 2
2 Solutions
 
Infinity08Commented:
strtok already treats multiple separator characters as one. So, I'm not sure what the question is.
0
 
evilrixSenior Software Engineer (Avast)Commented:
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
 
ehensensAuthor Commented:
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
What Kind of Coding Program is Right for You?

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.

 
Infinity08Commented:
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
 
evilrixSenior Software Engineer (Avast)Commented:
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
 
evilrixSenior Software Engineer (Avast)Commented:
^^^ I say should because I didn't test it very well :)
0
 
ehensensAuthor Commented:
So, then how would I get from params to a type:

    char* parameters[MAX_PARAMS];


0
 
evilrixSenior Software Engineer (Avast)Commented:
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 4
  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now