【面试题】C语言:模拟实现memcmp,试比较memcmp与strcmp,strncmp的区别

模拟实现内存比较函数memcmp:

该函数与strcmp有相似之处,都可用于字符串比较是否相同,若相同,则返回0值。若前者大于后者,则返回大于0的整型值,否则返回小于0的整型值。

区别在于:

strcmp只能比较字符串,memcmp是内存比较函数,原则上是比较内存的,但其实真正实现时并不是所有都可以比较,例如float,但我们至少可以比较字符串以及int型。而对于strcmp,strncmp的比较:str1, str2 为需要比较的两个字符串,n为要比较的字符的数目,而函数strcmp()做不到,strcmp()可以比较全部字符串(因为它找字符串结束标志‘\0’)。

关于strcmp的实现,可以查看我的博客http://10740184.blog.51cto.com/10730184/1714512

关于strncmp的实现,可以查看我的博客http://10740184.blog.51cto.com/10730184/1715207

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

int my_memcmp(const void *p1, const void *p2, size_t count)
{
    assert(p1);
    assert(p2);
    char *dest = (char *)p1;
    char *src = (char *)p2;
    while (count && *dest == *src)
    {
        count--;
        dest++;
        src++;
    }
    if (count == 0)
        return 0;
    else
        return *dest  - *src ;
}

int main()
{
    /*int arr1[] = { 1, 3, 20, 5 };            //比较整型
    int arr2[] = { 1, 3, 10, 7 };*/
    char arr1[] = "hello";                    //比较字符串
    char arr2[] = "hello world";
    int len = sizeof(arr1) / sizeof(arr1[0]);
    int ret = my_memcmp(arr1, arr2, 12);
    printf("%d", ret);
    system("pause");
    return 0;
}
时间: 2024-12-19 05:39:10

【面试题】C语言:模拟实现memcmp,试比较memcmp与strcmp,strncmp的区别的相关文章

语言模拟ATM自动取款机系统

C语言实验报告       题目名称:C语言模拟ATM自动取款机系统 C语言模拟实现ATM自动取款机功能:输入密码,余额查询,取款,存款,转账,修改密码,退出功能: 代码实现的功能: 账号及密码输入:用户输入密码,才能进入. 登陆成功界面:共有六个选项,查询余额.取款.存款.转账,修改密码,退出分别对应1,2,3,4,5,6选项,若序号输入不正确会予以提示. 选定1后,进入查询余额界面: 选定2后,进入取款界面: 选定3后,进入存款界面: 选定4后,修改密码,选定5,进入转账:选定6,退出界面:

关于c语言模拟c++的多态

关于c++多态,个人认为就是父类调用子类的方法,c++多态的实现主要通过虚函数实现,如果类中含有虚函数,就会出现虚函数表,具体c++多态可以参考<深度探索c++对象模型> c语言模拟多态主要通过函数指针实现,可以参考<Object Orientated Programming in ANSI-C> //shape.h #ifndef __SHAPE_H #define __SHAPE_H #include <stdio.h> #include <stdlib.h&

C/C++语言的标准库函数malloc/free与运算符new/delete的区别

概括地说 1.malloc与free是C++/C的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存. 2.对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求.对象在创建的同时,要自动执行构造函数,对象在消亡之前要自动执行析构函数.而由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free. 3.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符

C语言::模拟实现strlen函数

编写一个C语言程序模拟实现strlen函数. 算法 strlen函数功能是计算字符串中字符的个数.(除\0外) 而字符串本身就是一个字符数组,只不过末尾以\0结束. 因此,我们只需遍历除\0之外的所有字符即可. 有三种方法可以解决这个问题. 算法总结 方法一:设置一个整型计数器,遍历字符串. 方法二:通过不断函数自身的递归. 方法三:与方法一类似,设置一个char*变量标记字符串尾部,通过指针相减得到字符长度. 核心代码 //方法一:通过设置整型计数器,模拟实现strlen函数. int my_

C语言::模拟实现strcmp函数

题目要求 编写一个C语言程序模拟实现strcmp函数. (我们依然先模拟实现strcmp函数,然后再对照string.h库中strcmp函数的实现,对比与大师之间的差距.) 算法分析 通过上一篇文章:C语言::strcmp函数功能.原型.用法及实例我们获得了strcmp函数的如下信息: strcmp原型:int strcmp( const char *s1, const char *s2 ); strcmp功能:将两个字符串自左向右逐个字符进行相比(根据ASCII值大小),直到出现不同的字符或遇

C语言::模拟实现strcat函数

题目要求 编写一个C语言程序模拟实现strcat函数. (我们不妨先模拟实现一下strcat函数,然后再对照一下string.h库函数中strcat函数代码的实现,与大师肩并肩.) 算法分析 strcat函数功能:将两个字符串连接起来,最终返回连接后字符串的首地址. strcat函数原型:char *strcat(char *dest,const char *src); 我们清楚地了解了strcat函数功能和原型之后,就很容易分析出算法... 算法总结 第一步:将dest指向的内容循环遍历至'\

Swift,Objective-C语言性能对照測试

原文发表于踏得网 Swift包括了非常多现代语言特性尤其是从一些脚本语言如Javascript/Ruby中汲取了营养. 此外苹果公布Swift时,使用特别选用的一些样例来宣称Swift性能对于Ojbective C的大幅提升(40~50%),如复杂对象排序, Apple并未声称Swift APP比Objective-C APP性能优越,通过精心挑选的个例(也许是利用已知的Objective-C语言的缺陷), 却巧妙的留下了总体性能提升的印象.可是开发人员实际測试出来的情况却相反. 开发人员Kei

C语言模拟按键代码

其实 keybd_event 这个API的模拟按键需要按键码,如果用户输入一个字符,怎么用这个API打印出来呢?其实很简单.这个我是在易语言中发现的易语言中的一个 #R键 的值和R的ASCII码是一样的.也就是说,用户输入一个字符,用keybd_event这个API打印出来是很简单的.我们可以全部读取,取出一个字符的ASCII码,然后打出来,再取出另一个,以此类推......全部读取的话用动态数组是很好实现的. 拼音必须是大写的,否则打的可能都是数字还有一个MFC版本的 http://www.c

C语言模拟泛型-粘贴符##的使用 迁移

因为百度空间没有了,所及将以前写的一篇关于C语言粘贴符的使用的随笔迁移至此. 最近在百度知道看到有关C语言泛型的问题因为举例比较长,在这里作为回答,并作为C语言知识的记录,如果有不同意见,欢迎大家互相探讨,其实我的模拟泛型的思路就是使用粘贴符##以及宏定义完成.下面举例双向链表的实现,代码如下: #include "stdafx.h" #include <string.h> // 这里是对双向链表的定义,相当于泛型模板 #define DECLARE(node_type)