【整理】C语言从源码看字符串函数

参考了许多网上的资料,有些并不一定就是源码,但是原理是相同的

1. strcpy函数(strncpy)

strcpy(dest,src)

复制源串strSource到目标串strDestination所指定的位置, 包含NULL结束符. 不能处理源串与目标串重叠的情况.
函数返回strDestination值.
源码:

char *strcpy(char *strDes, const char *strSrc) {     
    //assert用以检测是否为空,通过assert处理异常来返回NULL   
    assert((strDes != NULL) && (strSrc != NULL)); 
    char *address = strDes;
    //一个个字符地将 source 字串赋值给 destination 字串
    while ((*strDes ++ = *strSrc ++) != '\0')        
        NULL;     
    return address; 
}
  • 关键点:assert判断有效性;NULL结束符。
    其实,可以不用指针变量address,只需返回strDes即可。

2. strncpy函数

strncpy(dest,src,count); 将str2中最前面的n个字符复制到str1中去,覆盖str1的最前面的n个字符
当n>=sizeof(src)时,拷贝正确,并在dest字符串后面加入’\0’;
当n<sizeof(src)时,只拷贝src前n-1个字符串到dest,不会为dest字符串后面加入’\0’;

char * strncpy (dest, source, count)
    //char *dest, *source;
    //unsigned count;
    {
        char *start = dest;
        while (count && (*dest++ = *source++))
            count--;
        if (count)//n>=sizeof(src)时,source拷贝完了,给dest补'\0'
        //如果count>0,'\0'已写入,不够的字符数都填充'\0'
            while (--count)
                *dest++ = '\0'; //继续写dest指向的字符
         return(start);
       }

3. strcmp函数

字符串比较的规则是:将两个字符串从左到右诸葛字符比较(按ASCII码值大小比较),知道出现不同的字符或遇到‘\0’为止. –>strcmp(str1,str2)
str1==str2,函数值为0
str1>str2,函数值为正整数
str1<str2,函数值为负整数

int strcmp(const char *s, const char *t) {    
    assert(s != NULL && t != NULL);  //断言s和t都不等于null
    //遍历字符串中的每一个字符,当字符不同时跳出循环
    while (*s && *t && *s == *t)
    {        
         ++ s;         
         ++ t;     
    }     
    return (*s - *t); 
}

4. strrev函数

将字符串string中的字符顺序颠倒过来. NULL结束符位置不变. 返回调整后的字符串的指针。–>strrev(str)

 //其基于的思想是:只是通过指针将元素的位置颠倒即可。
char *strrev(char *str)
{
    assert(str != NULL);     
    char *st,*et;
    char tmpCh;
    st=et=str;
    while(*et!='\0') ++et;
    //用2个指针st和et同时从首位一起遍历到中点进行翻转
    for(--et,st;st<et;++st,--et)
    {
        tmpCh=*st;
        *st=*et;
        *et=tmpCh;
    }
    return str; 
}

5. strcat函数

strcat(), 字符串的连接. –>strcat(str1,str2)

char *strcat(char *target,const char *source) 
{ 
    char *original=target; 
    while(*target) target++; //找到source字符串的末尾的位置
    while(*target++=*source++); 
    return(original); 
} 

6. strlen函数

strlen(),计算字符串长度

int strlen(const char string) 
{ 
    int i=0; 
    while(string[i]) i++;  //说明'\0'的ASIIC码为0
    return i; 
} 

6. chrcnt函数

chrcnt(), 计算某个字符在字符串中出现的次数.

int chrcnt(const char *string,int letter) 
{ 
    int count=0; 
    while(*string) 
    if(*string==letter)count++; 
    return count; 
} 

6. strlwr,strupr函数

strlwr(str) 转换为小写 string loweRcase
strupr(str) 转换为大写 string uppeRcase

char * strlwr(char *str)
{
   char *p = str;
   while (*p != '\0')
   {
      if(*p >= 'A' && *p <= 'Z')
        *p = (*p) + 0x20; //0x20==32
      p++;
    }
  return str;
}
/***************************/
char* strupr(char* src)
{
    while (*src != '\0')
    {
        if (*src >= 'a' && *src <= 'z')
            //在ASCII表里大写字符的值比对应小写字符的值小32.
            //*p -= 0x20; // 0x20的十进制就是32
            *src -= 32;
        src++;
    }
    return src;
}
Reference:

C语言字符串函数源码详解
C 语言中操作字符串的一些函数源代码
字符串函数—strcpy()与strncpy()详解及实现
strupr与strlwr函数的实现

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值