哪里可以看到c库函数的源码?

gnu的c运行库glibc,但是源码的实现却是复杂的,需要考虑效率,stlen源码分析

c-style字符串有个约定,以空字符结尾,即 '\0' 。

 char ch[] = { '', '' };
char ch1[] = { "" };
char ch2[] = "";

ch存了2个字符,ch1与ch2一样,存了3个字符,即结尾含有 '\0' 。

 char *c = "djawj\0p";

c不会存字符p,\0标识了结尾。

 strlen(ch);//stlen沿着ch的内存一直扫描,直到遇到空字符,这就导致了错误
 size_t strlen(const char *src)
{
assert(src!=NULL);//if (src == NULL) return ; 发生意外情况不返回,直接结束
const char *temp = src;
while (*temp++);
return (temp - src - );
}
 char* strcpy(char* dst, const char* src)
{
assert((dst != NULL) && (src != NULL));//断言,如果条件为false,停止程序运行
    char
while ((*dst++ = *src++) != '\0');
return dst;
}
 char* strcpy(char* dst, const char* src)
{
assert((dst != NULL) && (src != NULL));
char *tmp = dst;
while ((*dst++ = *src++) != '\0');
return tmp; //返回目的地址,支持链式操作strlen(dst2,strlen(dst1,src))
}

下面代码的问题是返回值不是1,0,-1,有多种值

int strcmp(const char *src, const char *dst)
{
assert((src != NULL) && (dst != NULL));
int result = ; while (*src != '\0'&& *dst != '\0')
{
if (*src == *dst) {
src++; dst++; //相等就比较下一个字符
}
else if (*src > *dst) return result = ;//src>dst
else return result = -; //src<dst
}
return *src - *dst; //三种情况,"abc" "abc" "abcd"
}

修改为为用result存两个字符之差来进行循环检测

 int strcmp(const char *src, const char *dst)
{
assert((src != NULL) && (dst != NULL));
int result = ; while (!(result = (*src - *dst)) && (*src != '\0'&& *dst != '\0'))
{ //修改为(!(result = (*src - *dst)) && ( *dst != '\0'))比较简洁
dst++;
src++; }
if (result < ) return -;
else if(result > ) return ;
else return ;
}

参考:http://www.cnblogs.com/xuhj001/archive/2013/11/17/3428088.html

C标准库strcmp实现

 int Strcmp2(char *str1, char *str2)
{
assert(str1 != NULL&&str2 != NULL);
for (; *str1 == *str2; str1++, str2++)
if (*str1 == '\0') return ;
return *str1 < *str2 ? - : ;
}

自己写的麻烦的实现:

 int Strcmp(char *s1, char *s2)
{
assert(s1 != NULL&& s2 != NULL);
int ret;
while (*s1 != '\0'&&*s2 != '\0')
{
//while (*s1++ == *s2++);
if (*s1 == *s2) { s1++; s2++; }
else {
ret = *s1 - *s2;
cout << ret << endl;
return ret < ? - : ;//不等<会返回1,大于则返回0,而不是-1 }
}
ret = *s1 - *s2;
if (ret < ) return -;
else return ret == ? : ;
}

char *strcat(char *s1,const char *s2) 可以用strcpy(s1+=strlen(s1),s2)实现

 char *Strcat(char *s, const char *s2)// Strcat不会另申请空间,而是需要s1有足够的空间可以容纳原s1与s2的字符
{
char *p = s;
while (*s++) //s的递增不影响实参指针的值,为了返回字符串的首地址,用p存下来
{
cout <<<< *s << " ";
}
s--;
while (*s++ = *s2++);//‘\0'的ascii值为0,结果为假,即表达式的值会转换为真或假
return p;
}

由于strcat一次拼接返回的是首指针,频繁拼接需要再次从开始位置扫描,找字符串的尾部,这样效率就低了

面试题:实现strcpy,strlen,strcmp,strcat,memcpy 之c-style字符串的更多相关文章

  1. 面试题之strcpy/strlen/strcat/strcmp的实现

    阿里的电面要我用C/C++实现一个字符串拷贝的函数,虽然以前写过 strcpy 的函数实现,但时间过去很久了,再加上有点紧张,突然就措手不及了.最后写是写出来了,但没考虑异常的情况,面试官好像很不满意 ...

  2. atoi、itoa,strcpy,strcmp,memcpy等实现

    原文:http://www.cnblogs.com/lpshou/archive/2012/06/05/2536799.html 1.memcpy.memmove.memset源码 link:http ...

  3. 不使用库函数、自己编写的(strlen、strcpy、strcmp、strcat、memcmp、memcpy、memmove)

    不使用库函数.自己编写的(strlen.strcpy.strcmp.strcat.memcmp.memcpy.memmove) //求字符串长度的函数 int my_strlen(const char ...

  4. strcpy/strlen/strcat/strcmp面试总结

    <strcpy拷贝越界问题> 一. 程序一 #include<stdio.h> #include<string.h> void main() { char s[]= ...

  5. 实现字符串函数,strlen(),strcpy(),strcmp(),strcat()

    实现字符串函数,strlen(),strcpy(),strcmp(),strcat() #include<stdio.h> #include<stdlib.h> int my_ ...

  6. 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...

  7. strlen sizeof strcat strcpy区别

      strlen(p): 能计算出p指向字符串的长度(以当前p的位置开始),不包含终止字符'\0': p可以声明为char* p或者char p[],这两种形式strlen均能正确计算. sizeof ...

  8. 笔试算法题(04):实现 string & memcpy & strcpy & strlen

    出题:请实现给定String的类定义: 分析:注意检查标准类构造注意事项: 解题: #include <stdio.h> #include <string.h> /** * 检 ...

  9. strlen、strcpy和strcmp源码

    1.不使用库函数实现strcpy #include <assert.h> char *strcpy(char *dst, const char *src) { assert((dst != ...

随机推荐

  1. Linux下查看日志文件

    问题一:日志文件打开,卡死 在公司开发的时候,开发的程序在本地测试正常,但是在测试环境却有问题.这个时候第一反应就是查看日志文件,看看日志文件里面有什么错误信息.我潇洒的执行了一下 vim log.t ...

  2. kmp(前中后最长相同长度)

    http://acm.hdu.edu.cn/showproblem.php?pid=4763 Theme Section Time Limit: 2000/1000 MS (Java/Others)  ...

  3. jquery动态加载select选项

    $("#selectid").get(0).options.add(new Option(json数据))

  4. Zookeeper之启动常见错误及解决方法

    Zookeeper启动后,有时候没有真正的启动,那我们如何查找错误呢,就可以查看zookeeper目录下面的zookeeper.out文件,就可以查看到错误了.zookeeper.out文件比较的重要 ...

  5. JavaScript —— 正则表达式元字符

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  6. ajax中的application/x-www-form-urlencoded中的使用[转]

    一,HTTP上传的基本知识 在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型.下边是说明: application/x-w ...

  7. Django组件——用户认证

    用户认证 一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1 .authentica ...

  8. [BJOI2006]狼抓兔子(网络流)

    题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...

  9. rabbitmq必须应答

    当autoAck设置为true时,只要消息被消费者处理,不管成功与否,服务器都会删除该消息, 而当autoAck设置为false时,只有消息被处理,且反馈结果后才会删除 https://www.cnb ...

  10. Mybatis-Generator demo

    使用Mybatis-Generator自动生成Dao.Model.Mapping相关文件(转) https://www.cnblogs.com/smileberry/p/4145872.html == ...