一、源代码说明
freecplus是一个Linux系统下的C/C++开源框架,源代码请前往C语言技术网(www.freecplus.net)下载。
本文介绍的是freecplus框架的字符串操作函数和类。
函数和类的声明文件是freecplus/_freecplus.h。
函数和类的定义文件是freecplus/_freecplus.cpp。
示例程序位于freecplus/demo目录中。
编译规则文件是freecplus/demo/makefile。
二、字符串复制
1、STRCPY函数
安全的strcpy函数。
函数声明:
1
| char *STRCPY(char* dest,const size_t destlen,const char* src);
|
参数说明:
dest:目标字符串,不需要初始化,在STRCPY函数中有初始化代码。
destlen:目标字符串dest占用内存的大小。
src:原字符串。
返回值:目标字符串dest的地址。
示例(demo1.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
#include "_freecplus.h"
int main() { char str[11];
STRCPY(str,sizeof(str),"freecplus"); printf("str=%s=\n",str); STRCPY(str,sizeof(str),"www.freecplus.net"); printf("str=%s=\n",str); }
|
2、STRNCPY函数
安全的strncpy函数。
函数声明:
1
| char *STRNCPY(char* dest,const size_t destlen,const char* src,size_t n);
|
参数说明:
dest:目标字符串,不需要初始化,在STRNCPY函数中有初始化代码。
destlen:目标字符串dest占用内存的大小。
src:原字符串。
n:待复制的字节数。
返回值:目标字符串dest的地址。
示例(demo2.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
#include "_freecplus.h"
int main() { char str[11];
STRNCPY(str,sizeof(str),"freecplus",5); printf("str=%s=\n",str); STRNCPY(str,sizeof(str),"www.freecplus.net",8); printf("str=%s=\n",str); STRNCPY(str,sizeof(str),"www.freecplus.net",17); printf("str=%s=\n",str); }
|
三、字符串拼接
1、STRCAT函数
安全的strcat函数。
函数声明:
1
| char *STRCAT(char* dest,const size_t destlen,const char* src);
|
参数说明:
dest:目标字符串,注意,如果dest从未使过,那么需要至少一次初始化。
destlen:目标字符串dest占用内存的大小。
src:待追加字符串。
返回值:目标字符串dest的地址。
示例(demo4.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
#include "../_freecplus.h"
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); }
|
2、STRNCAT函数
安全的strncat函数。
函数声明:
1
| char *STRNCAT(char* dest,const size_t destlen,const char* src,size_t n)
|
参数说明:
dest:目标字符串,注意,如果dest从未使过,那么需要至少一次初始化。
destlen:目标字符串dest占用内存的大小。
src:待追加字符串。
n:待追加的字节数。
返回值:目标字符串dest的地址。
示例(demo5.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
#include "../_freecplus.h"
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.net",6); printf("str=%s=\n",str);
STRCPY(str,sizeof(str),"www"); STRNCAT(str,sizeof(str),".freecplus.net",10); printf("str=%s=\n",str); }
|
四、格式化输出到字符串
1、SPRINTF函数
安全的sprintf函数,将可变参数(…)按照fmt描述的格式输出到dest字符串中。
函数声明:
1
| int SPRINTF(char *dest,const size_t destlen,const char *fmt,...);
|
参数说明:
dest:输出字符串,不需要初始化,在SPRINTF函数中会对它进行初始化。
destlen:输出字符串dest占用内存的大小,如果格式化后的字符串内容的长度大于destlen-1,后面的内容将丢弃。
fmt:格式控制描述。
…:填充到格式控制描述fmt中的参数。
返回值:格式化后的内容的长度,程序员一般不关心返回值。
示例(demo7.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
#include "_freecplus.h"
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); }
|
2、SNPRINTF函数
安全的snprintf函数,将可变参数(…)按照fmt描述的格式输出到dest字符串中。
函数声明:
1
| int SNPRINTF(char *dest,const size_t destlen,size_t n,const char *fmt,...);
|
参数说明:
dest:输出字符串,不需要初始化,在SNPRINTF函数中会对它进行初始化。
destlen:输出字符串dest占用内存的大小,如果格式化后的字符串内容的长度大于destlen-1,后面的内容将丢弃。
n:把格式化后的字符串截取n-1存放到dest中,如果n>destlen,则取destlen-1。
fmt:格式控制描述。
…:填充到格式控制描述fmt中的参数。
返回值:格式化后的内容的长度,程序员一般不关心返回值。
示例(demo8.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
#include "_freecplus.h"
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); }
|
五、删除字符串左、右和两边字符
删除字符串左边、右边和两边指定的字符。
函数声明:
1 2 3
| void DeleteLChar(char *str,const char chr); void DeleteRChar(char *str,const char chr); void DeleteLRChar(char *str,const char chr);
|
参数说明:
str:待处理的字符串。
chr:需要删除的字符。dest:输出字符串,不需要初始化,在SNPRINTF函数中会对它进行初始化。
示例(demo10.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
#include "../_freecplus.h"
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); }
|
注意,如果要删除字符串中间的字符,可以用freecplus框架中的UpdateStr函数,后面的章节中会介绍它。
六、字符串大小写转换
把字符串中的小写字母转换成大写,忽略不是字母的字符。
函数声明:
1 2 3 4
| void ToUpper(char *str); void ToUpper(string &str); void ToLower(char *str); void ToLower(string &str);
|
参数说明:
str:待转换的字符串,函数重载了char[]和string两种数据类型。
示例(demo12.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
#include "../_freecplus.h"
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中,如果存在字符串str1,就替换为字符串str2。
函数声明:
1
| void UpdateStr(char *str,const char *str1,const char *str2,const bool bLoop=true);
|
参数说明:
str:待处理的字符串。
str1:旧的内容。
str2:新的内容。
bloop:是否循环执行替换。
注意:
1)如果str2比str1要长,替换后str会变长,所以必须保证str有足够的长度,否则内存会溢出。
2)如果str2中包函了str1的内容,且bloop为true,存在逻辑错误,将不执行任何替换。
示例(demo14.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
#include "../_freecplus.h"
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); }
|
八、从字符串中提取数字
从一个字符串中提取出数字、符号和小数点,存放到另一个字符串中。
函数声明:
1
| void PickNumber(const char *src,char *dest,const bool bsigned,const bool bdot);
|
参数说明:
src:源字符串。
dest:目标字符串。
bsigned:是否包括符号(+和-),true-包括;false-不包括。
bdot:是否包括小数点的圆点符号,true-包括;false-不包括。
示例(demo16.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
#include "../_freecplus.h"
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); }
|
九、正则表达式
正则表达式,判断一个字符串是否匹配另一个字符串。
函数声明:
1
| bool MatchStr(const string str,const string rules);
|
参数说明:
str:需要判断的字符串,精确表示的字符串,如文件名"_freecplus.cpp"。
rules:匹配规则表达式,用星号"*“表示任意字符串,多个字符串之间用半角的逗号分隔,如”*.h,*.cpp"。
注意,str参数不支持"?“,rules只支持”*",函数在判断str是否匹配rules的时候,会忽略字母的大小写。
示例(demo18.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
#include "../_freecplus.h"
int main() { char filename[301];
STRCPY(filename,sizeof(filename),"_freecplus.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"); }
|
十、字符串的拆分
CCmdStr类用于拆分用分隔符分隔字段内容的字符串。
字符串的格式为:字段内容1+分隔符+字段内容2+分隔符+字段内容3+分隔符+…+字段内容n。
例如:“messi,10,striker,30,1.72,68.5,Barcelona”,这是足球运动员梅西的资料,包括姓名、球衣号码、场上位置、年龄、身高、体重和效力的俱乐部,字段之间用半角的逗号分隔开。
CCmdStr类的声明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
class CCmdStr { public: vector<string> m_vCmdStr;
CCmdStr();
void SplitToCmd(const string buffer,const char *sepstr,const bool bdelspace=true);
int CmdCount();
bool GetValue(const int inum,char *value,const int ilen=0); bool GetValue(const int inum,int *value); bool GetValue(const int inum,unsigned int *value); bool GetValue(const int inum,long *value); bool GetValue(const int inum,unsigned long *value); bool GetValue(const int inum,double *value); bool GetValue(const int inum,bool *value);
~CCmdStr(); };
|
示例(demo20.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
#include "../_freecplus.h"
struct st_player { char name[51]; char no[6]; bool striker; int age; double weight; long sal; char club[51]; }stplayer;
int main() { memset(&stplayer,0,sizeof(struct st_player));
char buffer[301]; STRCPY(buffer,sizeof(buffer),"messi,10,true,30,68.5,2100000,Barcelona");
CCmdStr CmdStr; CmdStr.SplitToCmd(buffer,","); CmdStr.GetValue(0, stplayer.name,50); CmdStr.GetValue(1, stplayer.no,5); CmdStr.GetValue(2,&stplayer.striker); CmdStr.GetValue(3,&stplayer.age); CmdStr.GetValue(4,&stplayer.weight); CmdStr.GetValue(5,&stplayer.sal); CmdStr.GetValue(6, stplayer.club,50); printf("name=%s,no=%s,striker=%d,age=%d,weight=%.1f,sal=%ld,club=%s\n",\ stplayer.name,stplayer.no,stplayer.striker,stplayer.age,\ stplayer.weight,stplayer.sal,stplayer.club); }
|
十一、统计字符串的字数
统计字符串的字数,全角的汉字和全角的标点符号算一个字,半角的汉字和半角的标点符号也算一个字。
函数声明:
1
| int Words(const char *str);
|
参数说明:
str:待统计的字符串。
返回值:字符串str的字数。
注意事项,本函数只适用用于Linux字符集为GBK的情况,在GB18030和Unicode编码中,汉字不一定是两个字节。
示例(demo21.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
#include "../_freecplus.h"
int main() { char buffer[301]; STRCPY(buffer,sizeof(buffer),"messi,10,true,30,68.5,2100000,Barcelona。"); printf("words=%d\n",Words(buffer));
STRCPY(buffer,sizeof(buffer),"梅西,10,true,30,68.5,2100000,Barcelona。"); printf("words=%d\n",Words(buffer)); }
|
十二、版权声明
C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
来源:C语言技术网(www.freecplus.net)
作者:码农有道