首页 > C > 字符串 阅读:57,774

字符串库函数应用

C的标准库为程序员提供了一组专门用于字符串操作的函。在了解了字符串的定义之后,就要学习一下在程序里如何利用与字符串相关的函数来操作字符串了。这些操作在大家以后写程序的时候,会经常遇到。一般来说,在程序里,起码有10%20%的代码都是在处理各种与字符串相关的问题,因此熟练掌握这些字符串操作函数,对提高编程效率是很有好处的。

 

6.9.1strlen

函数strlen()用于计算字符串中的字符个数(不含结尾字符’\0’)。对strlen的使用方法如下:

char *str=”hello world”;

size_t len =strlen(str);

6.9.2strstr

函数strstr()用于查找字符串中子串的位置,第一个参数为主串,第二个为子串。如果未找到,则返回NULLStrstr()的使用方法如下:

         char *pstr=(char *)strstr("hello world","xyz");

         if(pstr!=NULL)

                   printf("%s\n",pstr);

6.9.3strcmp,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.4strchr/strrchr

函数strchr()用于从左边开始在字符串中查找某个字符的位置;而strrchr()则是从字符串中的右边开始查找某个字符的位置。若未找到,则返回NULL

 char *str=”hello world”;

char *p=strchr(str,’o’);

char *pr=strrchr(str,’o’);

6.9.5strcpy,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.6strcat,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.7strtok,strtok_s

C语言中,strtok()的原型为:char *strtok(char *s, char *delim),它的功能为:将字符串s拆分为为一组字符串,delim为分隔符。

比如对于IP地址,”192.168.100.1”,可以通过分隔符’.’IP地址拆分为4个字符串。函数strtok_sstrtok安全,增加了溢出检测。下面是分别使用strtokstrtok_s的例子。

    1strtok() ,已经淘汰,请使用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); 

      } 

    2strtok_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()

周哥教IT,分享编程知识,提高编程技能,程序员的充电站。跟着周哥一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

当你决定关注「周哥教IT」,你已然超越了90%的程序员!

IT黄埔-周哥教IT技术交流QQ群:213774841,期待您的加入!

二维码
微信扫描二维码关注