7.C语言之字符串操作函数

来源:互联网 发布:大学生借款软件 编辑:程序博客网 时间:2024/06/14 16:10

在这一节,我想主要来介绍一下C语言操作字符串的常用函数。

C语言的字符串函数的原型都驻留在<string.h>头文件中,因此我们在处理字符串时,需要引入这个头文件。

但是,我不希望只是单纯地介绍每个函数的用法,如果那样,看API就可以了,我希望在介绍每个函数时都自己来实现一次。

1. strcpy函数

string copy,我们先来看一下该函数的用法。

#include<stdio.h>#include<string.h>int main(){    char *str1="abcd";    char str2[5];       strcpy(str2,str1);    printf("%s",str2);    return 0;}

在上段代码中,我们注意,str2的字符串长度应该是5,也就是strlen(“abcd”)加上’\0’。在上面的代码中,我们将str1的字符串复制到了str2中。

我们也来看下,这两段代码的区别:

#include<stdio.h>#include<string.h>int main(){    char str1[5]="abcd";    char str2[5];       char *str3=str1;    strcpy(str2,str1);    str1[1]='t';    printf("str2:%s\n",str2);    printf("str3:%s",str3);    return 0;}

我们对比结果可以发现他们的不同,在这里,我们不妨回头想想Java/C#的深复制和浅复制。

当我们修改第一段代码为这样时会发现错误:

#include<stdio.h>#include<string.h>int main(){    char str1[5]="abcd";    char str2[3];       strcpy(str2,str1);    str1[1]='t';    printf("str2:%s\n",str2);    return 0;}

错误的原因就是,str2不足以容纳下str1的字符串,也就是说strcpy我们没有足够的控制权,那么我们就可以来采用strncpy的方法来实现:

#include<stdio.h>#include<string.h>int main(){    char str1[5]="abcd";    char str2[3];       strncpy(str2,str1,sizeof(str2)-1);    str2[sizeof(str2)-1]='\0';    printf("str2:%s\n",str2);    return 0;}

这个方法就不多说了,就是加上了一个长度控制,接下来我们来试着实现一下简单的strcpy函数。

#include<stdio.h>#include<string.h>char *mycopy(char *,const char *);int main(){    char str1[5]="abcd";    char str2[5];       mycopy(str2,str1);    printf("%s",str2);    return 0;}char *mycopy(char *strDest,const char *strSource){    char *temp=strDest;    while(*temp++=*strSource++)        ;    return strDest;}

同理,我们也可以写出strncpy的代码:

char *mycopy(char *strDest,const char *strSource,int size){    char *temp=strDest;    int i =0;    while(i<size)    {        *temp++=*strSource++;        i++;    }    *temp='\0';    return strDest;}

2. 再谈字符串的问题

其实我之前一直都没有想懂关于字符串中修改某一字符的问题,我一直很困扰这样一个问题:

我收回在上一节中说的观点,其实字符串是否能修改取决的是这段字符串是否位于常量区

3. strlen函数

这个很简单,实现一下:

size_t mylength(char * str){    int count=0;    while(*str++)    {        count++;    }    return (size_t)count;}

但是如果这样来写,每次当指针前移的时候,都需要进行一次加法操作,会对效率造成一定的影响,我们可以这样来写:

size_t mylength(char * str){    char *temp=str;    while(*temp++)        ;    return (size_t)(temp-str-1);}

4. strcmp函数

字符串比较函数:

int mycompare(const char *str1,const char *str2){    while(*str1==*str2)    {        if(*str1=='\0')        {            return 0;        }        str1++;        str2++;    }    return *str1>*str2?1:-1;}