帮我写一个简易的strcmp函数(C语言)。

作者&投稿:乐府 (若有异议请与网页底部的电邮联系)
C语言strcmp函数是什么样的代码~

C语言中strcmp函数是string库的常用函数。其原型代码和介绍如下:
1.先说一下这个函数的实现原理,向strcmp()函数中传入两个字符串(记为str1,str2).传入之后,通过把str1的各字母的ASCII码值和str2的各字母的ASCII码值进行比较。若str1>str2则返回正数,若str1=str2则返回0,否则,则返回负数。
2.下面实现代码:

3.整个函数的原型中得益于“(*str1!='\0')&&(*str1==*str2)”这一句的代码,因为这样当字符指针指向空,意味着字符串已经移动到最后了,比较结束,此时可以退出循环。而如果两个字符串不相等时,则此时函数也可以退出了。
扩展资料:
这个函数要注意一下几点:
①使用*(unsigned char*)str1而不是用*str1。这是因为传入的参数为有符号数,有符号字符值的范围是-128~127,无符号字符值的范围是0~255,而字符串的ASCII没有负值,若不转化为无符号数这回在减法实现时出现错误。
②While循环中ret=*(unsigned char*)str1-*(unsigned char*)str2) && *str1,最后与上str1也可以换成str2,因为前面已经做了相减,无论哪个先为‘\0’都会退出。因为最后与上str1是为了判断str1是否结束,即是否为‘\0’。
③这个函数没有判断参数为NULL时的情况,所以当传入NULL时程序会崩溃。网上看别人说商业化代码都会在调用strcmp前先判断是否为NULL,所以可以不用判断NULL;我在VC6上测试string.h中的strcmp(NULL,NULL),程序也会崩溃。这里可以根据实际情况来决定。
参考资料来源:百度百科-strcmp函数

strcmp返回的实际上是两个字符串中第一个不同的字符的ASCII码的差,差大于0说明是>关系,小于0则是0,和1一样是表示大于,而且返回ASCII码的确切差值,可以方便用来实现一些其他的应用,比只知道大于带来了更多的信息

① c的strcmp简洁实现可以是这样的:

int strcmp(const char* s1, const char* s2)
{
    while(*s1 && (*s1==*s2))
        s1++,s2++;
    return *(const unsigned char*)s1-*(const unsigned char*)s2;
}

② strcmp的返回值可以有3种,即<0, =0, >0 (任意一个数值),代表的含义分别是: str1 strcmp用的是二进制比较,意思是按字典顺序,比如: 字母a < 字母 b;而a > A。 (这是因为a的ascii码是97,而A的是65)。

理解了这个,上面的代码就好理解了。 while就是s1,s2从头到位一个一个字符的比较。如果s1为空,或者s1不等于s2,则中断循环 (s1不为空,s2为空,则是*s1 != *s2,退出循环)。返回值是循环中断时的字符(分别s1和s2对应的位置,*s1-*s2, 如果是上面说的 'a' - 'A', 那么返回的就是97-65=32),那么意味着a在A前面, strcmp > 0。

之所以先转换成const unsigned char*再作减法,是由于c的char有三种: char, signed char 和unsigned char。 char就是'a'这样的, 而 signed char 则是-127~126之间的数值,而unsigned char则是0~255之间的一个值。 转换成unsigned char就是要“确保” 'a' ---> 97。 你要不转换,也是可以的。

说明一点,很多c的lib实现,比如gnu c, 都是把结果处理成: -1, 0, 1, 而不是这个字符对应的ascii码的差值。



int strcmp_s(char *src,char*des){
if(src==NULL||des==NULL) return NULL;
while((*src++==*des++)!='\0');
if(*src=='\0') return 0;
return (*src-*des);
}



st股票什么意思
股票ST,是指这只股票被特别处理,是针对经营情况出现问题上市企业或者具备别的风险上市企业,股票比较常见的ST情况就是上市公司经营收入出现连续三年的亏本。大家能将ST简易解读为一种风险性警示标识,即股票代码作为前缀发生ST时,提醒此股具备一些风险性。st股票什么意思除开ST外,也有*ST,上市企业持续亏...

用Sublime Text搭建简易IDE编写Verilog代码
1. 安装Sublime Text 3。 后面我将其简称为ST ,就像安装QQ一样,一路点next就好了 2. 安装关键词高亮插件。用ST打开一个verilog文件(后缀名为.v)中,发现是没有高亮显示的,       按ctrl+shift+p,调出ST的包管理窗口,输入install package,再输入verilog后找到对应的...

急!求大神!!!利用C语言设计一个简易的学生信息管理系统,包括 学号 姓...
for(i=1;i<=n;i++) { p=(list *)malloc(sizeof(list));printf("请输入学生学号:\\n");scanf("%d",&p->num);printf("请输入学生姓名:\\n");scanf("%s",&p->name);p->next=Null;r->next=p; \/\/ 这个地方我总是不明白,是怎样让结点下移一个的呢?r=r->next;} return...

ST是什么意思?
ST:ShippingTicket装货单 ND:NationalDebt国债 RD:RestrictedData内部资料 TH:TapeHandler磁带处理程序 英语简写:英文缩写词它是用一个单词或词组的简写形式来代表一个完整的形式,它不同于首字母缩写词。英文缩写是英语词语的简易形式,用英文单词中重要的字母来代表整个单词的意义,也被成为缩略词。一个...

电路st是什么意思?
电路ST一般是指集成电路中STMicroelectronics公司生产的部件。STMicroelectronics公司是一家跨国半导体制造商,总部位于瑞士。其产品包括微控制器、存储器、传感器和功率半导体等。而电路ST则是该公司生产的电路元件之一。这些电路元件常被用于各类电子设备产品中,例如电视、手机、平板电脑等。电路ST的性能优异,是...

简易超声波蜂鸣器的制作方法
某宝上很多自拍神器,有蓝牙控制和线控等,这一次我将向大家介绍一种最近比较流行的超声波自拍神器,方便实用,成本低。1.方案介绍:首先手机先到网上下载一个APP(Airshooting),然后打开APP,利用STM32 NUCLEO-F072RB开发板的定时器产生一定频率PWM信号,用来控制蜂鸣器发出声音,当手机接收到蜂鸣器发出的...

用c语言写使用单链表建立一个简易商品库存表的程序
void addByName(STK **stkHead,STK **stkTail,STK *stkNew,char *name);\/\/向指定名称商品后添加节点,不存在添加在表头 void meError(void *p);\/\/内存申请失败 int add2Tail(STK **stkHead,STK **stkTail,STK *stkNew);\/\/向链表尾部添加新节点, 成功返回1,失败返回0 int add2Head(STK ...

简易c++斗地主源码,简单的斗地主不需要ui,只要能发牌,随机决定地主,把...
UINT _uCardIndex; \/\/ _emCardClass为_CC_King时,有效取值[1,2]\/\/ _emCardClass非_CC_King时,有效取值[1,13]};using namespace std;void InitCard(vector<st_Card_t>& vtCard){ st_Card_t card;for( UINT i=0; i<_CC_King; i++ ){ card._emCardClass = (em_CardClass_...

梦幻西游ST带的70级简易,珍宝斧头228伤害,437命中,极品吗???560W...
437\/3+228=374总伤害,再上2级玛瑙的话,是390的总伤害,非比武号买着还行 不过,他才打了5级石头,560W贵了点 3点命中=1点伤害 武器总伤害不上400,都不怎么能算极品

C# 简易TCP网口调试助手(一) 客户端Client
以下是主要代码编写内容:1. TcpClient的创建和“连接”、“断开”按钮的简单代码实现 代码如下:2. TcpClient的“数据接收”、”连接状态“的事件函数处理 和 “发送”按钮的简单代码实现 代码如下:其中,跨UI线程的解决方式和原出处不同。原出处是通过关闭跨UI线程报错来解决问题,这里是调用Form的...

大安区13587604602: 写一些函数,实现两个字符串的比较,即自己写一个strcmp函数,函数原型为int strcmp(char *p1,char *p2);设p1指向字符串s1,p2指向字符串s2.要求当s... -
泷燕劲迈:[答案] int mystrcmp(char *p1,char *p2){ int i=0; while(p1[i] && p2[i] && p1[i]==p2[i]) i++; return p1[i]-p2[i]; }

大安区13587604602: 1. 编写一个strcmp函数实现两个字符串的比较: -
泷燕劲迈: int stringcmp(char *s1,char *s2){while(*s1||*s2) //如果S1和S2比较完毕 ('\\0')跳出循环;{if(*s1-*s2) //判断S1和S2对应的字符是不是不同;return *s1-*s2; //如果不同,返回S1和S2的ASCII之差;else // 如果相同,让指针指向S1和S2的下一个字符比较{s2++;s1++;}}return 0; // S1和S2相等的时候返回0;}

大安区13587604602: 写一个函数,实现两个字符串的比较.即自己写一个strcmp函数 -
泷燕劲迈: int *strcmp(const char *s1, const char *s2) {for(; *s1==*s2; s1++, s2++)if(*s1 == '\0')return 0; return ((unsigned *)*s1 < (unsigned *)*2 ? -1 : +1); }

大安区13587604602: . 用一个函数实现两个字符串的比较,自己写一个strcmp函数,函数原型为int strcmp(char *p1,char *p2), -
泷燕劲迈: int strcmp(char *p1,char *p2) {int i=0;i=p1-p2;while((*p1 != null) && (*p2 != null) && (i == 0)){p1++;p2++;i=p1-p2;}if(i==0)return 0;else if(i>0)return 1;else if(i<0)return -1;elsereturn 2;//异常 }

大安区13587604602: 写strcmp函数 -
泷燕劲迈: int _strcmp(char *s, char *t) /*_strcmp避免与内置函数strcmp冲突*/ { for(;*s==*t;s++,t++) if(*s==0) return 0; return *s-*t; }

大安区13587604602: 编写一个自己的库函数strcmp(),用来实现实现两个字符串的比较 -
泷燕劲迈: int strcmp(char *p1, char *p2) {for( ; *p1 == *p2; p1++,p2++)if(*p1 == '\0')return 0;return *p1 - *p2; }

大安区13587604602: 写一个strcmp函数,实现两个字符串的比较. 求注释.ORZ! -
泷燕劲迈: 函数strcmp是这样对两个字符串进行比较的:对两个字符串依次从头逐位比较,直到两个字符串有某一位不同,然后比较其ASCII码.如果两个字符串比到最后都一样,则比较其长度.定义一个变量i就是要进行循环比较的. 其实可以在strcmp函数中再加一个参数i,用来接收字符串的长度,这样就可以比较任意长度的字符串了

大安区13587604602: 用C语言实现:strcmp(str1,str2)函数,比较两个字符串的大小(不区分大小写) -
泷燕劲迈: unsigned int strcmp(const char *str1, const char *str2) const {while(((*(str1++)==*(str2++))) && *str1 && *str2 ); return (*str1-*str2); }不区分大小写:可以把位于'A'-'Z'之间的字符加上32可变为'a'-'z'之间的字符后再调用上述函数.

大安区13587604602: 用一个函数实现两个字符串的比较,即自己写一个strcmp函数,函数原型为 :int strcmp
泷燕劲迈: 修改如下: #include &lt;stdio.h&gt; void main() { int strcmp(char *s1,char *s2); char str1[30],str2[30]; printf("\n please input string1:"); gets(str1); printf("\n please input string2:"); gets(str2); printf("%d\n",strcmp(str1,str2)); } int strcmp(char *s1,...

大安区13587604602: 请编写一个函数实现两个字符串的比较,即用户编写一个strcmp函数要求实参为字符数组形参为字符指针 -
泷燕劲迈: #includeint strcmp(char *p1,char *p2){ while(*p1||*p2) { if(*p1!=*p2) return(*p1-*p2); else { p1++; p2++; } } return 0; }void main(){ char s1[20],s2[20],*p1,*p2; //字符串 int k; printf("请键入两个字符串:\n"); scanf("%s %s",s1,s2); p1=s1; p2=s2; k=strcmp(p1,p2); printf("Result is:%d\n",k);}

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网