自編幾個有用的C字符串、IP、端口處理函數

本文介绍了一系列实用的字符串处理技巧,包括获取字符串末尾字符、移动字符串字符、过滤空格及制表符、验证IP地址与端口等。通过这些技巧,能够有效地提升字符串处理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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(++< BufferSize)
    
{
        NextSQLQuery 
= Buffer + i;
    }

    
    
return TRUE;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值