C语言学习笔记(9)

在这一节,我想主要来介绍一下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;
}
posted @ 2010-04-11 01:53  飞林沙  阅读(615)  评论(1编辑  收藏  举报