1、返回字符串最後一個字符之指針
char *FindStrEnd(char *)
//返回字符串最後一個字符之指針
inline char *FindStrEnd(char * str)

...{
return (str + strlen(str) - 1);
}
例子:
char *str = "This is a sample!";
char *ptr;
ptr = FindStrEnd(str);
printf("%c ", ptr);

得到:
!
2、字符串前移一個字符
比如:字符串“baaa”,給此函數b的指針,移動後成為“aaa”。
//char *from必須是個字符串的指針
//char *from此字符會被後面的字符覆蓋
void MovePrevious(char *from)
{
char *end = FindStrEnd(from);
char *ptr = from;
while(ptr != end)
{
*ptr = *(ptr + 1);
ptr++;
}
*ptr = '/0';
return;
}
3、空格、Tab過濾函數
void SpacesFilter(char *head)
{
unsigned int len = strlen(head);
unsigned int i, j;
char *ptr;
for(i = 0; i < len; i++)
{
if(*(head + i) == 9 || *(head + i) == 32)
{
MovePrevious(head + i);
}
}
return;
}
例如:
char str[] = "this is a sample!";
printf("before=%s/n", str);
SpacesFilter(str);
printf(" after=%s/n", str);
輸出:
before=this is a sample!
after=thisisasample!
4、祛字符串頭部某種字符
你很煩,你有個字符串“aaa123456789”,你不想要頭上的這堆'a'。
用用這個函數吧,它會讓你快樂許多。
char mystr[] = "aaa123456789";
DoffHeadSomeChar(mystr, 'a');
printf("%s/n", mystr);
輸出:
123456789
//祛除字符串頭部的某種字符
void DoffHeadSomeChar(char *Str, const char DoffChar)

...{
unsigned i, j;
unsigned times = 0;

for(i = 0; i < strlen(Str); i++)

...{
if(*(Str + i) == DoffChar)

...{
times++;
}
else

...{
break;
}
}

j = times;

for(i = 0; i < times; i++)

...{
MovePrevious(Str + j - 1);
j--;
}

return;
}
5、IP地址合法性驗證函數(僅IP地址,包含E、F類;255.255.255.255判定為非法)
//IP地址驗證函數
BOOL ValidateIPAddress(const char *IPAddress)

...{
unsigned long part1 = 0;
unsigned long part2 = 0;
unsigned long part3 = 0;
unsigned long part4 = 0;


sscanf(IPAddress, "%d.%d.%d.%d", &part1, &part2, &part3, &part4);

if(part1 > 0 && part1 < 255 && part2 > 0 && part2 < 255 && part3 > 0 && part3 < 255 && part4 > 0 && part4 < 255)

...{
return TRUE;
}
return FALSE;
}
6、端口合法性驗證函數(0為不合法)
//端口合法性驗證
BOOL ValidatePort(const char *Port)

...{
unsigned long intPort = 0;
sscanf(Port, "%d", &intPort);
if(intPort > 0 && intPort < 65535)

...{
return TRUE;
}
return FALSE;
}

//重載
BOOL ValidatePort(const unsigned short Port)

...{
if(Port > 0 && Port < 65535)

...{
return TRUE;
}
return FALSE;
}
7、IP地址填充函數
會將類似202.1.2.3填充成202.001.002.003等等。
//IP地址填充函數
void IPAddressFill(char *IP_Address)

...{
unsigned long part1 = 0;
unsigned long part2 = 0;
unsigned long part3 = 0;
unsigned long part4 = 0;


char Fixed_IP_Address[16] = ...{0};
sscanf(IP_Address, "%d.%d.%d.%d", &part1, &part2, &part3, &part4);
sprintf(Fixed_IP_Address, "%03d.%03d.%03d.%03d", part1, part2, part3, part4);
memcpy(IP_Address, Fixed_IP_Address, 16);

return;
}
8、端口填充函數
端口填充函數。
char Port[6] = {0};
PortFill(111, Port);
得到Port = "00111"(字符串)
//端口填充函數
void PortFill(const unsigned short Port, char *New_Port)

...{
//65535
*New_Port = UIntToChar(Port / 10000);
*(New_Port + 1) = UIntToChar(Port / 1000 % 10);
*(New_Port + 2) = UIntToChar(Port / 100 % 100 % 10);
*(New_Port + 3) = UIntToChar(Port / 10 % 100 % 10);
*(New_Port + 4) = UIntToChar(Port % 10);
*(New_Port + 5) = '
9、獲得字符串中空格、制表符字符的數目。
寬窄字符自適應版本
//獲得字符串中空格、制表符字符的數目
unsigned short GetSpacesAmount(const TCHAR * const szString)

...{
unsigned short i = 0, j = 0;
while(*(szString + i) != '/0')

...{
if(*(szString + i) == 0x09 || *(szString + i) == 0x20)

...{
++j;
}
++i;
}

return j;
}
10、過濾空格、制表符函數
寬字符版本。
//過濾空格、制表符函數
void SpacesFilter(TCHAR * szString)

...{
unsigned int Len = wcslen(szString);
unsigned int i, j;
unsigned short SpacesAmount = GetSpacesAmount(szString);

for(j = 0; j < SpacesAmount; j++)

...{
for(i = 0; i < Len; i++)

...{
if(*(szString + i) == 0x09 || *(szString + i) == 0x20)

...{
MovePrevious(szString + i);
}
}
}
return;
}
11、祛換行函數(寬字符版本)
將一個換行符(0x0D 0x0A)替換成兩個空格(0x20),寬字符版本。
//祛換行(換行置空格)
void ReplaceNewLineToSpace(TCHAR * const Buffer, //語句池緩衝區
const unsigned short BufferSize, //緩衝區大小
const unsigned short Offset, //語句開始偏移
const unsigned short ProcessSize) //處理數目

...{
BOOL Flag = FALSE;
unsigned short Size;
BufferSize < ProcessSize ? Size = BufferSize : Size = ProcessSize;

unsigned short i = 0;
while(i < Size)

...{
if(*(Buffer + i) == 0x0D)

...{
Flag = TRUE;
}
else

...{
//碰見了換行
if((*(Buffer + i) == 0x0A) && Flag)

...{
//換行點處理
*(Buffer + i) = 0x20;
*(Buffer + i - 1) = 0x20;
}
}

i++;
}

return;
}
12、獲取一條查詢語句函數。
緩沖區里有類似如下內容:
select * from aaa where id = 1;select * from bbb where id = 100;select ip from ccc where id > 44;……
要一條一條語句的獲取,就用這個函數。函數的NextSQLQuery將返回下一條語句的地址,如上例中的紅色s處。
寬字符版本。
這個函數還可以做別的用。
//取得一條SQL語句
BOOL GetASQLQuery(const TCHAR * const Buffer, //語句池緩衝區
const unsigned int BufferSize, //緩衝區大小
const TCHAR DividedSymbol, //分隔符
TCHAR * Query, //目標語句緩衝區
const unsigned short QueryMax, //目標語句緩衝區大小
const TCHAR * NextSQLQuery) //下一條SQL語句之起始地址

...{
NextSQLQuery = NULL;

unsigned int i = 0;
//
while(*(Buffer + i) != DividedSymbol)

...{
//如果接收緩沖區不夠長
if(i > QueryMax)

...{
return FALSE;
}

*(Query + i) = *(Buffer + i);
i++;
}

//即算下一條語句開始處并返回
if(++i < BufferSize)

...{
NextSQLQuery = Buffer + i;
}
return TRUE;
}