哪里可以看到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. nmon内存分析

    可参考: MemTotal:显示当前服务器物理内存大小,本服务器有8063180 KB≍7874 MB左右. MemFree:显示当前服务器的空闲内存大小,本服务器有5052336 KB≍4934 M ...

  2. Angular2+之模态框-使用ngx-bootstrap包中的模态框组件实现

    模态框是项目中经常会用到的一个公共功能,通常会被用左提示框或者扩展选项框. 下面,我用一个小例子来简单展示实现模态框功能的过程: 1.为项目加包: ng add ngx-bootstrap 2.在xx ...

  3. python学习第九天数据类型列表创建,查找操作方法

    数据类型中列表是整个python最常用的数据类型,列表最常用的方法就是创建,增删改查,切片,循环以及排序等系列操作,任何操作都离不开增删改查操作,这样很容记住操作方法 1,列表的创建 list=[] ...

  4. Linux学习之文件搜索命令

    一.文件搜索命令locate locate 文件名 在后台数据库中按文件名搜索,搜索速度最快 /var/lib/mlocate #locate命令所搜索的后台数据库(数据库不会实时刷新,所以新建的文件 ...

  5. Debian(Linux)+XAMPP(LAMPP)+Zend Studio + PHP +XDebug 完整的开发环境配置方法。 转摘:http://www.cnblogs.com/kungfupanda/archive/2010/11/25/1887812.html

    经历了3天左右的挣扎,终于在Linux下将 php开发工具 Zend Studio 的 xdebug安装成功,分享如下: 1,装XAMPP,安装方法链接如下:这里假设XAMPP的安装路径为:/opt/ ...

  6. k3 cloud总账凭证点击保存的时候提示未将对象引用到对应的实例

    检查以后发现是创建日期的用了创建日期,修改了一下日期就可以了

  7. Mata标签,og标签

    一.Mata标签 meta是用来在HTML文档中模拟HTTP协议的响应头报文,meta 标签用于网页的<head>与</head>中.meta 的属性有两种:name和http ...

  8. R语言ggplot2软件包

    相比r语言自带软件包,ggplot2有以下特色 图形语法的核心:统计图形是数据向几何对象属性的一个映射.

  9. elasticsearch相关聚合查询示例

    索引(index):logstash-nginx-*,type:nginx_access 请求路径: 1.按照某个字段进行分组统计访问量 { "query": { "bo ...

  10. HTML5 canvas绘制图形

    demo.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...