哪里可以看到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. Ubuntu下的图形化多线程下载器XDM

    目录 1.下载 2.安装 3.浏览器支持 使用Ubuntu下载东西经常过于缓慢,因此需要多进程下载器. 1.下载 下载链接:http://xdman.sourceforge.net/#download ...

  2. java创建线程的两种方式及源码解析

    创建线程的方式有很多种,下面我们就最基本的两种方式进行说明.主要先介绍使用方式,再从源码角度进行解析. 继承Thread类的方式 实现Runnable接口的方式 这两种方式是最基本的创建线程的方式,其 ...

  3. IDEA永久破解方法

    链接: https://pan.baidu.com/s/1a1pMOP6rMrh-wJdUFSCqAw 提取码: 46cx 复制这段内容后打开百度网盘手机App,操作更方便哦

  4. 《剑指offer》面试题10 二进制中1的个数 Java版

    书中方法一:对于每一位,用1求与,如果为1表明该位为1.一共要进行32次,int4字节32位. public int check(int a){ int result = 0; int judge = ...

  5. 纯css实现星级评分效果

    效果 效果图如下,纯css实现超酷炫的星级评分动画效果 ​ 实现思路 5个类型为radio的input,label标签修改样式背景图为星星 label标签给每个星星鼠标停留时加注名字 点击星星有放大旋 ...

  6. presentingViewController、presentedViewController区别

    解释两个属性:presentingViewController 和 presentedViewController A----(present)-----B----(present)-----C 1. ...

  7. Tomcat的用途

    总结: 这篇文章主要反思了Tomcat的作用.本文主要是自己的一个思考过程,不是严谨地介绍和详细总结Tomcat使用方法的文章.最后尝试利用tomcat的知识,以URL的形式来访问文件夹(在浏览器的地 ...

  8. windows切换窗口和网页快捷键

    alt+tab 切换窗口win+D 显示桌面,再按一下返回运来的网页win+M 所有程序最小化 网页之间切换(我用的是360) ctrl + tab 往回切 ctrl + shift +tab

  9. Shell07--正则应用

    目录 1. 正则表达式概述 2. 正则表达式规则 3. 正则表达式之GREP文本过滤 4. 正则表达式之SED文本处理 5. 正则表达式之AWK文本处理 1. 正则表达式概述 01. 什么是正则表达式 ...

  10. Android作业list

    作业1. 请在自己的电脑上完成Android的安装与配置,并完成Hello Android项目.上交自己与项目的合照,将照片传至QQ群中. ------------------------------ ...