splitting strings
Hi
does anyone know how to split a string into 2 at the first occurance of a comma in c (no stl please)? i.e.
First[256], Second[256];
TestString = "firststring,secondstring"
split (TestString, First, Second, '','')
First = "firststring"
Second = "secondstring"
the comma woundn''t be included in either of the strings
i''ve been trying it out with tokens but the results seem a little unpredictable (the msdn help file for strtok isnt much help either)
thanks
void split(char * input, char * first, char * second, char splitchar) {
int inputSize = (int)strlen(input);
int firstStringPos = 0;
int secondStringPos = 0;
first[0] = 0;
second[0] = 0;
int nextChar = 0;
for(; nextChar < inputSize; nextChar++);
if(input[nextChar] == splitchar) break;
first[firstStringPos++] = input[nextChar];
first[firstStringPos] = 0; // just to null terminate it each time...
};
for(; nextChar < inputSize; nextChar++) {
second[secondStringPos++] = input[nextChar];
second[secondStringPos] = 0;
};
};
.... I hope this works I cannot test it, lol!
www.cppnow.com
int inputSize = (int)strlen(input);
int firstStringPos = 0;
int secondStringPos = 0;
first[0] = 0;
second[0] = 0;
int nextChar = 0;
for(; nextChar < inputSize; nextChar++);
if(input[nextChar] == splitchar) break;
first[firstStringPos++] = input[nextChar];
first[firstStringPos] = 0; // just to null terminate it each time...
};
for(; nextChar < inputSize; nextChar++) {
second[secondStringPos++] = input[nextChar];
second[secondStringPos] = 0;
};
};
.... I hope this works I cannot test it, lol!
www.cppnow.com
keep in mind that if the delimiter character is NOT found, second string will be "".
www.cppnow.com
www.cppnow.com
Oops a mistake.
add this statement BETWEEN the two for loops:
nextChar++;
...This will increment the position of the input string to omit the delimiter character (the "comma" in your example).
www.cppnow.com
add this statement BETWEEN the two for loops:
nextChar++;
...This will increment the position of the input string to omit the delimiter character (the "comma" in your example).
www.cppnow.com
quote:Original post by AINewbie
i''ve been trying it out with tokens but the results seem a little unpredictable (the msdn help file for strtok isnt much help either)
thanks
The strtok function is not very intuitive, but its probably the easiest way to do what you want in C. Try this,
char testString[20] = "Hello,world";
char *first, *second;
first = strtok(testString, '','');
second = strtok(NULL, "\0\r\n");
The first strtok sets the string to scan and the delimiter to stop at, and returns the first word. The second strtok remembers which string to scan and starts where the last strtok left off, hence the NULL, the second parameter tells strtok to stop at the end of the string, and returns the second word.
HTH
strtok reuses existing strings, it seems.
In the original post, C++ source shows that he defined 2 separate strings first[256] and second[256].
I wrote the split function on the assumption that he wants 2 unique strings with their own allocations, and also without altering the original string, which I believe strtok does.
Don''t get me wrong I like strtok (I also find it confusing sometimes though too
www.cppnow.com
In the original post, C++ source shows that he defined 2 separate strings first[256] and second[256].
I wrote the split function on the assumption that he wants 2 unique strings with their own allocations, and also without altering the original string, which I believe strtok does.
Don''t get me wrong I like strtok (I also find it confusing sometimes though too
www.cppnow.com
his original code could always be modified to use strtok and just add a couple of strcpy''s to create the two seperate buffers (if he don''t mind loosin'' the odd comma or two )
i had a look at the strtok documentation, and yeah, it does seem a bit backwards in coming forwards. when i first read it i got so worried the countless warnings of how easy it was to corrupt the data that i abandoned them (ah, to be a newb again). just don''t go calling it with different strings in recursive functions )
i had a look at the strtok documentation, and yeah, it does seem a bit backwards in coming forwards. when i first read it i got so worried the countless warnings of how easy it was to corrupt the data that i abandoned them (ah, to be a newb again). just don''t go calling it with different strings in recursive functions )
You can use strcspn() and strncpy()/strcpy() to get the same effect, if you're concerned about messing up the original or multithreading/recursive issues.
I didn't test the above, I'll leave it as an exercise for the OP if it doesn't work
EDIT: Fixed first copy to properly terminate.
[edited by - cgoat on April 1, 2003 3:15:47 PM]
const char *original = "Hello,There";char first[256], second[256];size_t comma_position;comma_position = strcspn(original, ",");// Make sure there's something on both sides of the commaif((comma_position > 0) && (original[comma_position + 1] != 0)){ // Copy up to comma in first string strncpy(first, original, comma_position); // Properly terminate first first[comma_position] = 0; // Copy remaining string past comma into second string strcpy(second, &(original[comma_position+1]));}
I didn't test the above, I'll leave it as an exercise for the OP if it doesn't work
EDIT: Fixed first copy to properly terminate.
[edited by - cgoat on April 1, 2003 3:15:47 PM]
Apparently, strcspn() returns the position of the null character if the character isn''t found. Take that into account as well.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement