C标准库文件之string.c文件



C标准库文件之string.c文件

String.h头文件中定义许多常用的字符串操作函数


类型:

        size_t

:

        NULL,用来初始化指针

函数

原型:

#include <string.h>

void* memcpy(void* s1, const void* s2, size_t n);

描述:

        复制s2所指对象的n个字节到s1;对于s1s2重叠的问题没有处理

返回值:

        返回s1

源码:

void* memcpy(void* s1, const void* s2, size_t n)
{
    char* su1;
    const char* su2;
    for(su1 = s1, su2 = s2; 0 < n; ++su1, ++su2, --n)
        *su1 = *su2;
    return s1;
}

原型:

                  #include<string.h>

                  void*memmove(void* s1, const void* s2, size_t n);

描述:

        复制s2所指对象的n个字节到s1;s1s2重叠的问题进行了处理

返回值:

        返回s1

源码:

void* memmove(void* s1, const void* s2, size_t n)
{
    char* sc1;
    const char* sc2;
    sc1 = s1;
    sc2 = s2;
    if(sc2 < sc1 && sc1 < sc2 + n) //即sc1位于sc2与sc2 + n之间
        for(sc1 += n, sc2 += n; 0 < n; --n) //从后往前复制,以免覆盖sc2的字节
            *--sc1 = *--sc2;
    else
        for( ; 0 < n; --n)
            *sc1++ = *sc2++;
    return s1;
}

原型:

                  #include<string.h>

                  void*memset(void* s1, int c, size_t n)

描述:

        c复制到s1所指的内存的n个字节

返回值:

        返回s1

源码:

void* memset(void* s, int c, size_t n)
{
    const unsigned char uc = c;
    unsigned char* su = s;

    for(su = s; 0 < n; ++su, --n)
        *su = uc;

    return s;
}

原型:

                  #include<string.h>

                int memcmp(const void *s1, const void*s2, size_t n);

描述:

        比较s1s2的前n个字符

返回值:

        如果s1 < s2,则返回值小于0

        如果s1 == s2则返回值等于0

        如果s1 > s2;则返回值大于0

 

源码:

int memcmp(const void* s1, const void* s2, size_t n)
{
    const unsigned char *su1, *su2;

    for(su1 = s1, su2 = s2; 0 < n; ++su1, ++su2, --n)
        if(*su1 != *su2)
            return ((*su1 < *su2) ? -1: +1;

    return 0;
}

原型:

                  #include<sting.h>

                  void*memchr(const void* s, int c, size_t n);

描述:

        s中的前n个字符中查找c出现的第一个位置,该方法将c转换成unsignedchar类型

返回值:

        返回查找到的第一个位置的指针,否则返回NULL

源码:

void* memchr(const void* s, int c, size_t n)
{
  const unsigned char uc = c;

  const unsigned char* su;
  for(su = s; 0 < n && *s != '\0'; ++su, --n)
        if(*su == uc)
            return (void*)su;

  return NULL;
}



原型:

                  #include<string.h>

                  char*strcpy(char* s1, const char* s2)

描述:

        将字符串s2复制到s1中,如果s1s2的区域重叠,则该行为未定义

返回值:

        返回s1

源码:

char* strcpy(char* s1, const char* s2)
{
    char* s;
    for(s = s1; (*s1++ = *s2++) != '\0'; );

    return s1;
}


原型:

                  #include<string.h>

                  char*strncpy(char* s1, const char* s2, size_t n)

描述:

        将字符串s2的前n个字符复制到s1中,如果s1s2的区域重叠,则该行为未定义;

如果字符串s2的长度小于n,则用’\0’填充s1n个字符。

返回值:

        返回s1

 

源码:

char* strncpy(char* s1, const char* s2, size_t n)
{
    char* s;
    for(s = s1; 0 < n && *s2 != '\0'; --n)
        *s++ = *s2++;
    for(; 0 < n; --n)
        *s++ = '\0';

    return s1;
}

原型:

                  #include<string.h>

                  char*strcat(char* s1, const char* s2)

描述:

        将字符串s2拼接到s1的尾部,并且会覆盖s1字符串的’\0’.如果s1s2的区域重叠,则该行为未定义

返回值:

        返回s1

源码:

char* strcat(char* s1, const char* s2)
{
    assert(s1 != NULL && s2 != NULL);
    if(s1 == NULL || s2 == NULL) return NULL;

    char* s;

    for(s = s1; *s != '\0'; ++s);
    for(; (*s = *s2) != '\0'; ++s, ++s2);
    return s1;
}

 原型:

                  #include<string.h>

                  char*strncat(char* s1, const char* s2, size_t n)

描述:

        将字符串s2n个字符拼接到s1的尾部,并且会覆盖s1’\0’,如果s1s2的区域重叠,则该行为未定义

返回值:

        返回s1

源码:

char* strncat(char* s1, const char* s2, size_t n)
{
    char *s;
    for(s = s1; *s != '\0'; ++s);
    for( ; 0 < n && *s2 != '\0'; --n)
        *s++ = *s2++;
    *s = '\0';
    return s1;
}

原型:

                  #include<string.h>

                  intstrcmp(char* s1, const char* s2)

描述:

        比较字符串s1s2

返回值:

        如果s1 > s2,则返回值大于0

        如果s1 == s2,则返回值等于0

        否则,返回值小于0

源码:

int strcmp(const char* s1, const char* s2)
{
    for(; *s1 == *s2; ++s1, ++s2)
        if(*s1 == '\0')
            return 0;
    return *(unsigned char*)s1 < *(unsigned char*)s2 ? -1 : 1;
}

原型:

                  #include<string.h>

                  char*strchr(char* s, int c)

描述:

        找出c(转化为char型)在字符串s中第一次出现的位置,’\0’被当做字符串的一部分

返回值:

        返回c在字符串s中第一次出现的位置,或者返回NULL

源码:

char* strchr(const char* s, int c)
{
    const char ch = c;

    for(; *s != ch; ++s)
        if(*s == '\0')
            return NULL;

    return (char*)s;
}

原型:

                  #include<string.h>

                  char*strrchr(char* s, int c)

描述:

        找出c(转化为char型)在字符串s1中最后一次出现的位置,’\0’被当做字符串的一部分

返回值:

        返回c在字符串s中最后一次出现的位置,或者返回NULL

源码:

char* strrchr(const char* s, int c)
{
    const char ch = c;
    const char *sc;

    for(sc = NULL; ; ++s)
    {
        if(*s == ch)
            sc = s;
        if(*s == '\0')
            return (char*)sc;
    }
}

原型:

                  #include<string.h>

                  char*strstr(const char* s1,const char* s2)

描述:

        找出字符串s2在字符串s1中第一次出现的位置

返回值:

        返回s2在字符串s1中第一次出现的位置,或者返回NULL

源码:

char* strstr(const char* s1, const char* s2)
{
    if(*s2 == '\0')
        return (char*)s1;
    for(; (s1 = strchr(s1, *s2)) != NULL; ++s1)
    {
        const char *sc1, *sc2;
        for(sc1 = s1, sc2 = s2; ;)
            if(*++sc2 == '\0')
                return (char*)s1;
            else if(*++sc1 != *sc2)
                break;
    }
    return NULL;
}

原型:

                  #include<string.h>

                  char*strerror (int errornum)

描述:

        查找错误代码errornum对应的string消息

返回值:

        返回该string消息的指针

源码:

 

 


原型:

                  #include<string.h>

                  Size_t*strlen(char* s)

描述:

        计算字符串s的长度,不包含字符串结束符’\0’

返回值:

        返回字符串s的长度,该长度不包含字符串结束符’\0’

源码:

size_t strlen(const char* s)
{
    const char* sc;
    for(sc = s; *sc != '\0'; ++sc);

    return sc - s;
}

       




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值