📄 ~mstring.~cpp
字号:
// MString.cpp: implementation of the CMString class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "..\IIDS.h"
#include "MString.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//##ModelId=407BA7B0039E
CMString::CMString()
{
}
//##ModelId=407BA7B0039F
CMString::~CMString()
{
}
/****************************************************************
*
* Function: mSplit()
*
* Purpose: Splits a string into tokens non-destructively.
*
* Parameters:
* char *str => the string to be split
* char *sep => a string of token seperaters
* int max_strs => how many tokens should be returned
* int *toks => place to store the number of tokens found in str
* char meta => the "escape metacharacter", treat the character
* after this character as a literal and "escape" a
* seperator
*
* Returns:
* 2D char array with one token per "row" of the returned
* array.
*
****************************************************************/
//##ModelId=407BA7B00380
char ** CMString::mSplit(char *str, char *sep, int max_strs, int *toks, char meta)
{
char **retstr; /* 2D array which is returned to caller */
char *idx; /* index pointer into str */
char *end; /* ptr to end of str */
char *sep_end; /* ptr to end of seperator string */
char *sep_idx; /* index ptr into seperator string */
int len = 0; /* length of current token string */
int curr_str = 0; /* current index into the 2D return array */
char last_char = (char) 0xFF;
if (!str) return NULL;
*toks = 0;
/*
* find the ends of the respective passed strings so our while() loops
* know where to stop
*/
sep_end = sep + strlen(sep);
end = str + strlen(str);
/* remove trailing whitespace */
while(isspace((int) *(end - 1)) && ((end - 1) >= str))
*(--end) = '\0'; /* -1 because of NULL */
/* set our indexing pointers */
sep_idx = sep;
idx = str;
/*
* alloc space for the return string, this is where the pointers to the
* tokens will be stored
*/
if((retstr = (char **) malloc((sizeof(char **) * max_strs))) == NULL)
exit(1);;
max_strs--;
/* loop thru each letter in the string being tokenized */
while(idx < end)
{
/* loop thru each seperator string char */
while(sep_idx < sep_end)
{
/*
* if the current string-indexed char matches the current
* seperator char...
*/
if((*idx == *sep_idx) && (last_char != meta))
{
/* if there's something to store... */
if(len > 0)
{
if(curr_str <= max_strs)
{
/* allocate space for the new token */
if((retstr[curr_str] = (char *)
malloc((sizeof(char) * len) + 1)) == NULL)
{
exit(1);
}
/* copy the token into the return string array */
memcpy(retstr[curr_str], (idx - len), len);
retstr[curr_str][len] = 0;
/* twiddle the necessary pointers and vars */
len = 0;
curr_str++;
last_char = *idx;
idx++;
}
/*
* if we've gotten all the tokens requested, return the
* list
*/
if(curr_str >= max_strs)
{
while(isspace((int) *idx))
idx++;
len = end - idx;
fflush(stdout);
if((retstr[curr_str] = (char *)
malloc((sizeof(char) * len) + 1)) == NULL)
exit(1);
memcpy(retstr[curr_str], idx, len);
retstr[curr_str][len] = 0;
*toks = curr_str + 1;
return retstr;
}
}
else
/*
* otherwise, the previous char was a seperator as well,
* and we should just continue
*/
{
last_char = *idx;
idx++;
/* make sure to reset this so we test all the sep. chars */
sep_idx = sep;
len = 0;
}
}
else
{
/* go to the next seperator */
sep_idx++;
}
}
sep_idx = sep;
len++;
last_char = *idx;
idx++;
}
/* put the last string into the list */
if(len > 0)
{
if((retstr[curr_str] = (char *)
malloc((sizeof(char) * len) + 1)) == NULL)
exit(1);
memcpy(retstr[curr_str], (idx - len), len);
retstr[curr_str][len] = 0;
*toks = curr_str + 1;
}
/* return the token list */
return retstr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -