字符串库函数应用
C的标准库为程序员提供了一组专门用于字符串操作的函。在了解了字符串的定义之后,就要学习一下在程序里如何利用与字符串相关的函数来操作字符串了。这些操作在大家以后写程序的时候,会经常遇到。一般来说,在程序里,起码有10%到20%的代码都是在处理各种与字符串相关的问题,因此熟练掌握这些字符串操作函数,对提高编程效率是很有好处的。
6.9.1 strlen
函数strlen()用于计算字符串中的字符个数(不含结尾字符’\
char *str=”hello world”;
size_t len =strlen(str);
6.9.2 strstr
函数strstr()用于查找字符串中子串的位置,第一个参数为主串,第二个为子串。如果未找到,则返回NULL。Strstr()的使用方法如下:
char *pstr=(char *)strstr("hello world","xyz");
if(pstr!=NULL)
printf("%s\n",pstr);
6.9.3 strcmp,stricmp
函数strcmp()用于比较2个字符串是否相等,而stricmp()也是用于比较两个字符串是否相等,但其中多了个i(ignore),表示在比较的时候忽略字符串的大小写。而strncmp()和strnicmp()则是比较2个字符串前n个字符的大小。如果2个字符串相等,函数返回零。
char *st3 = "helloworld";
char *st4 = "hElloMallocfree";
if(strcmp(st3,st4)==0)
{
printf("%s == %s\n",st3,st4);
}
else
{
printf("%s != %s\n",st3,st4);
}
if(stricmp(st3,st4)==0)
{
printf("%s == %s\n",st3,st4);
}
else
{
printf("%s != %s\n",st3,st4);
}
if(strnicmp(st3,st4,5)==0)
{
printf("%s == %s\n",st3,st4);
}
else
{
printf("%s != %s\n",st3,st4);
}
6.9.4 strchr/strrchr
函数strchr()用于从左边开始在字符串中查找某个字符的位置;而strrchr()则是从字符串中的右边开始查找某个字符的位置。若未找到,则返回NULL。
char *str=”hello world”;
char *p=strchr(str,’o’);
char *pr=strrchr(str,’o’);
6.9.5 strcpy,strcpy_s
函数strcpy()用于将字符串复制到目标缓存,但并不检测目标缓存的长度是否大于字符串的长度,无论是否超过,都照拷不误,因此是很多缓冲区溢出漏洞的罪魁祸首。于是在Windows平台推出了新的安全拷贝函数strcpy_s()。新的函数将检测字符串的长度是否超过了目标缓存的大小,如果超过,则拒绝拷贝并返回失败。
char *str = "hello world!";
1,strcpy()的使用方法,已被淘汰,勿用,否则会在高版本编译器报4996警告。
char buf[1024] = {0};
strcpy(buf, str);
printf("buf:%s\n",buf);
2,strcpy_s()的使用方法,注意在buf后面多了一个长度作为函数的参数。
memset(buf, 0, 1024);
strcpy_s(buf,1024, str);
printf("buf:%s\n",buf);
6.9.6 strcat,strcat_s
函数strcat()用于字符串的拼接。比如将”hello
”和”world”拼接在一起,组成”hello
world”。与strcpy()类似,strcat()并不检测目标缓冲的大小是否能够容纳下拼接之后的字符串,因此也容易造成缓冲区溢出漏洞。而新的安全拼接函数strcat_s()避免了这个问题。
char path[MAX_PATH]={0};
1,strcat()的使用方法,已被淘汰,勿用:
strcpy(path, "c:\\windows\\");
strcat(path, "system32\\drivers\\x.sys");
2,strcat_s()的使用方法,限制了写入长度的安全方法:
strcpy_s(path,260,"c:\\windows\\system32\\");
strcat_s(path,260,"hellodrv.sys");
6.9.7 strtok,strtok_s
在C语言中,strtok()的原型为:char *strtok(char *s, char *delim),它的功能为:将字符串s拆分为为一组字符串,delim为分隔符。
比如对于IP地址,”192.168.
1,strtok() ,已经淘汰,请使用strtok_s()
char *s = "Nice to meet you!";
char *d = " ";
char *p
= NULL;
p=strtok(s,d);
while(p)
{
printf("%s\n",p);
p = strtok(NULL,d);
}
2,strtok_s()例子
char ip[]="192.168.100.1";
char *next = NULL;
char *pfield=strtok_s(ip,".",&next);
while(pfield)
{
printf("%s\n",pfield);
pfield=strtok_s(NULL,".",&next);
}
下表将C语言中对ASCII字符串与UNICODE字符串的操作函数做一个归纳比较:
表 ASCII字符串与UNICODE字符串的操作函数对比
功能 |
ASCII |
UNICODE |
打印一个字符 |
%c |
%wc或%C |
打印一个字符串 |
%s |
%ws或%S |
求长度 |
strlen() |
wcslen() |
拷贝字符串 |
strcpy()/strncpy() |
wcscpy()/wcsncpy() |
比较 |
strcmp()/strncmp() |
wcscmp()/wcsncmp() |
附加 |
strcat()/strncat() |
wcscat()/wcsncat() |