安全的strcpy函数。
char *STRCPY(char* dest,const size_t destlen,const char* src)
{
if (dest==0) return 0;
memset(dest,0,destlen);
if (src==0) return dest;
if (strlen(src)>destlen-1) strncpy(dest,src,destlen-1);
else strcpy(dest,src);
return dest;
}
int main(int argc,char *argv[])
{
char str[11];
STRCPY(str,sizeof(str),"google");
printf("str=%s=\n",str);
STRCPY(str,sizeof(str),"www.google.com");
printf("str=%s=\n",str);
}
安全的strncpy函数。
char *STRNCPY(char* dest,const size_t destlen,const char* src,size_t n)
{
if (dest==0) return 0;
memset(dest,0,destlen);
if (src==0) return dest;
if (n>destlen-1) strncpy(dest,src,destlen-1);
else strncpy(dest,src,n);
return dest;
}
int main()
{
char str[11];
STRNCPY(str,sizeof(str),"google",5);
printf("str=%s=\n",str);
STRNCPY(str,sizeof(str),"www.google.com",8);
printf("str=%s=\n",str);
STRNCPY(str,sizeof(str),"www.google.com",17);
printf("str=%s=\n",str);
}
安全的strcat函数
char *STRCAT(char* dest,const size_t destlen,const char* src)
{
if (dest==0) return 0;
if (src==0) return dest;
unsigned int left=destlen-1-strlen(dest);
if (strlen(src)>left) { strncat(dest,src,left); dest[destlen-1]=0; }
else strcat(dest,src);
return dest;
}
int main()
{
char str[11];
STRCPY(str,sizeof(str),"www");
STRCAT(str,sizeof(str),".fr");
printf("str=%s=\n",str);
STRCAT(str,sizeof(str),"eecplus.net");
printf("str=%s=\n",str);
}
安全的strncat函数
char *STRNCAT(char* dest,const size_t destlen,const char* src,size_t n)
{
if (dest==0) return 0;
if (src==0) return dest;
size_t left=destlen-1-strlen(dest);
if (n>left) { strncat(dest,src,left); dest[destlen-1]=0; }
else strncat(dest,src,n);
return dest;
}
int main()
{
char str[11];
STRCPY(str,sizeof(str),"www");
STRNCAT(str,sizeof(str),".free",10);
printf("str=%s=\n",str);
STRCPY(str,sizeof(str),"www");
STRNCAT(str,sizeof(str),".freecplus.com",6);
printf("str=%s=\n",str);
STRCPY(str,sizeof(str),"www");
STRNCAT(str,sizeof(str),".freecplus.com",10);
printf("str=%s=\n",str);
}
安全的sprintf函数
int SPRINTF(char *dest,const size_t destlen,const char *fmt,...)
{
if (dest==0) return -1;
memset(dest,0,destlen);
va_list arg;
va_start(arg,fmt);
int ret=vsnprintf(dest,destlen,fmt,arg );
va_end(arg);
return ret;
}
int main()
{
char str[21];
SPRINTF(str,sizeof(str),"name:%s,no:%d","messi",10);
printf("str=%s=\n",str);
SPRINTF(str,sizeof(str),"name:%s,no:%d,job:%s","messi",10,"striker");
printf("str=%s=\n",str);
}
安全的snprintf函数
int SNPRINTF(char *dest,const size_t destlen,size_t n,const char *fmt,...)
{
if (dest==0) return -1;
memset(dest,0,destlen);
int len=n;
if (n>destlen) len=destlen;
va_list arg;
va_start(arg,fmt);
int ret=vsnprintf(dest,len,fmt,arg );
va_end(arg);
return ret;
}
int main()
{
char str[26];
SNPRINTF(str,sizeof(str),5,"messi");
printf("str=%s=\n",str);
SNPRINTF(str,sizeof(str),9,"name:%s,no:%d,job:%s","messi",10,"striker");
printf("str=%s=\n",str);
SNPRINTF(str,sizeof(str),30,"name:%s,no:%d,job:%s","messi",10,"striker");
printf("str=%s=\n",str);
}
删除字符串左边指定的字符
void DeleteLChar(char *str,const char chr)
{
if (str == 0) return;
if (strlen(str) == 0) return;
char strTemp[strlen(str)+1];
int iTemp=0;
memset(strTemp,0,sizeof(strTemp));
strcpy(strTemp,str);
while ( strTemp[iTemp] == chr ) iTemp++;
memset(str,0,strlen(str)+1);
strcpy(str,strTemp+iTemp);
return;
}
删除字符串右边指定的字符
// str:待处理的字符串。
// chr:需要删除的字符。
void DeleteRChar(char *str,const char chr)
{
if (str == 0) return;
if (strlen(str) == 0) return;
int istrlen = strlen(str);
while (istrlen>0)
{
if (str[istrlen-1] != chr) break;
str[istrlen-1]=0;
istrlen--;
}
}
删除字符串左右两边指定的字符
void DeleteLRChar(char *str,const char chr)
{
DeleteLChar(str,chr);
DeleteRChar(str,chr);
}
int main()
{
char str[11];
STRCPY(str,sizeof(str)," 西施 ");
DeleteLChar(str,' ');
printf("str=%s=\n",str);
STRCPY(str,sizeof(str)," 西施 ");
DeleteRChar(str,' ');
printf("str=%s=\n",str);
STRCPY(str,sizeof(str)," 西施 ");
DeleteLRChar(str,' ');
printf("str=%s=\n",str);
}
把字符串中的小写字母转换成大写,忽略不是字母的字符
void ToUpper(char *str)
{
if (str == 0) return;
if (strlen(str) == 0) return;
int istrlen=strlen(str);
for (int ii=0;ii<istrlen;ii++)
{
if ( (str[ii] >= 'a') && (str[ii] <= 'z') ) str[ii]=str[ii] - 32;
}
}
void ToUpper(string &str)
{
if (str.empty()) return;
char strtemp[str.size()+1];
STRCPY(strtemp,sizeof(strtemp),str.c_str());
ToUpper(strtemp);
str=strtemp;
return;
}
int main()
{
char str1[31];
STRCPY(str1,sizeof(str1),"12abz45ABz8西施。");
ToUpper(str1);
printf("str1=%s=\n",str1);
STRCPY(str1,sizeof(str1),"12abz45ABz8西施。");
ToLower(str1);
printf("str1=%s=\n",str1);
string str2;
str2="12abz45ABz8西施。";
ToUpper(str2);
printf("str2=%s=\n",str2.c_str());
str2="12abz45ABz8西施。";
ToLower(str2);
printf("str2=%s=\n",str2.c_str());
}
把字符串中的大写字母转换成小写,忽略不是字母的字符
// str:待转换的字符串,支持char[]和string两种类型。
void ToLower(char *str)
{
if (str == 0) return
if (strlen(str) == 0) return
int istrlen=strlen(str)
for (int ii=0
{
if ( (str[ii] >= 'A') && (str[ii] <= 'Z') ) str[ii]=str[ii] + 32
}
}
void ToLower(string &str)
{
if (str.empty()) return
char strtemp[str.size()+1]
STRCPY(strtemp,sizeof(strtemp),str.c_str())
ToLower(strtemp)
str=strtemp
return
}
字符串替换函数
void UpdateStr(char *str,const char *str1,const char *str2,bool bloop)
{
if (str == 0) return;
if (strlen(str) == 0) return;
if ( (str1 == 0) || (str2 == 0) ) return;
if ( (bloop==true) && (strstr(str2,str1)>0) ) return;
int ilen=strlen(str)*10;
if (ilen<1000) ilen=1000;
char strTemp[ilen];
char *strStart=str;
char *strPos=0;
while (true)
{
if (bloop == true)
{
strPos=strstr(str,str1);
}
else
{
strPos=strstr(strStart,str1);
}
if (strPos == 0) break;
memset(strTemp,0,sizeof(strTemp));
STRNCPY(strTemp,sizeof(strTemp),str,strPos-str);
STRCAT(strTemp,sizeof(strTemp),str2);
STRCAT(strTemp,sizeof(strTemp),strPos+strlen(str1));
strcpy(str,strTemp);
strStart=strPos+strlen(str2);
}
}
int main()
{
char str[301];
STRCPY(str,sizeof(str),"name:messi,no:10,job:striker.");
UpdateStr(str,":","=");
printf("str=%s=\n",str);
STRCPY(str,sizeof(str),"name:messi,no:10,job:striker.");
UpdateStr(str,"name:","");
printf("str=%s=\n",str);
STRCPY(str,sizeof(str),"messi----10----striker");
UpdateStr(str,"--","-",false);
printf("str=%s=\n",str);
STRCPY(str,sizeof(str),"messi----10----striker");
UpdateStr(str,"--","-",true);
printf("str=%s=\n",str);
STRCPY(str,sizeof(str),"messi-10-striker");
UpdateStr(str,"-","--",false);
printf("str=%s=\n",str);
STRCPY(str,sizeof(str),"messi-10-striker");
UpdateStr(str,"-","--",true);
printf("str=%s=\n",str);
}
从一个字符串中提取出数字的内容,存放到另一个字符串中
void PickNumber(const char *src,char *dest,const bool bsigned,const bool bdot)
{
if (dest==0) return;
if (src==0) { strcpy(dest,""); return; }
char strtemp[strlen(src)+1];
memset(strtemp,0,sizeof(strtemp));
strcpy(strtemp,src);
DeleteLRChar(strtemp,' ');
int ipossrc,iposdst,ilen;
ipossrc=iposdst=ilen=0;
ilen=strlen(strtemp);
for (ipossrc=0;ipossrc<ilen;ipossrc++)
{
if ( (bsigned==true) && (strtemp[ipossrc] == '+') )
{
dest[iposdst++]=strtemp[ipossrc]; continue;
}
if ( (bsigned==true) && (strtemp[ipossrc] == '-') )
{
dest[iposdst++]=strtemp[ipossrc]; continue;
}
if ( (bdot==true) && (strtemp[ipossrc] == '.') )
{
dest[iposdst++]=strtemp[ipossrc]; continue;
}
if (isdigit(strtemp[ipossrc])) dest[iposdst++]=strtemp[ipossrc];
}
dest[iposdst]=0;
}
int main()
{
char str[26];
STRCPY(str,sizeof(str),"iab+12.3xy");
PickNumber(str,str,false,false);
printf("str=%s=\n",str);
STRCPY(str,sizeof(str),"iab+12.3xy");
PickNumber(str,str,true,false);
printf("str=%s=\n",str);
STRCPY(str,sizeof(str),"iab+12.3xy");
PickNumber(str,str,true,true);
printf("str=%s=\n",str);
}
正则表达式,判断一个字符串是否匹配另一个字符串
bool MatchStr(const string &str,const string &rules)
{
if (rules.size() == 0) return false;
if (rules == "*") return true;
int ii,jj;
int iPOS1,iPOS2;
CCmdStr CmdStr,CmdSubStr;
string strFileName,strMatchStr;
strFileName=str;
strMatchStr=rules;
ToUpper(strFileName);
ToUpper(strMatchStr);
CmdStr.SplitToCmd(strMatchStr,",");
for (ii=0;ii<CmdStr.CmdCount();ii++)
{
if (CmdStr.m_vCmdStr[ii].empty() == true) continue;
iPOS1=iPOS2=0;
CmdSubStr.SplitToCmd(CmdStr.m_vCmdStr[ii],"*");
for (jj=0;jj<CmdSubStr.CmdCount();jj++)
{
if (jj == 0)
{
if (strncmp(strFileName.c_str(),CmdSubStr.m_vCmdStr[jj].c_str(),CmdSubStr.m_vCmdStr[jj].size()) != 0) break;
}
if (jj == CmdSubStr.CmdCount()-1)
{
if (strcmp(strFileName.c_str()+strFileName.size()-CmdSubStr.m_vCmdStr[jj].size(),CmdSubStr.m_vCmdStr[jj].c_str()) != 0) break;
}
iPOS2=strFileName.find(CmdSubStr.m_vCmdStr[jj],iPOS1);
if (iPOS2 < 0) break;
iPOS1=iPOS2+CmdSubStr.m_vCmdStr[jj].size();
}
if (jj==CmdSubStr.CmdCount()) return true;
}
return false;
}
int main()
{
char filename[301];
STRCPY(filename,sizeof(filename),"_public.h");
if (MatchStr(filename,"*.h,*.cpp")==true) printf("yes\n");
else printf("no\n");
if (MatchStr(filename,"*.H")==true) printf("yes\n");
else printf("no\n");
if (MatchStr(filename,"*.cpp")==true) printf("yes\n");
else printf("no\n");
return 0;
}