用c语言编写strcmp函数,求c语言实现strcmp功能的自编程序
用c语言编写strcmp函数,求c语言实现strcmp功能的自编程序详细介绍
本文目录一览: 求c语言实现strcmp功能的自编程序
#include
int main(){ int strcmp(char * p1,char * p2); char * s1 = "hello world"; char s2[] = "hello_world"; char s3[] = "hello world"; if(strcmp(s1,s2)==0){ printf("String s1 and s2 are equal!\n"); } else{ printf("String s1 and s2 are not equal!\n"); } if(strcmp(s1,s3)==0){ printf("String s1 and s3 are equal!\n"); } else{ printf("String s1 and s3 are not equal!\n"); } getchar(); return 0;}//自己编写的一个比较字符串的函数int strcmp(char * p1,char * p2){ for(;;) { if(*p1=='\0' && *p2=='\0'){ return 0; } if(*p1!=*p2){ return (*p1 - *p2); } p1++; p2++; }}
C语言strcmp函数是什么样的代码
strcmp(s1,s2)
相同返回0
当s1
<s2时,返回值
s2时,返回值>0 即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如: "A"<"B" "a">"A" "computer">"compare" 特别注意:strcmp(s1,s2)这里面只能比较字符串,不能比较数字等其他形式的参数。
strcmp简介:
函数原型int strcmp(const char *str1,const char *str2);
其作用为
将str1的各个字母的ASCII码与str2的进行比较。
若str1>str2则返回整数,若str1=str2返回0,否则,返回负数
一般这样调用:
if(strcmp(str1,str2)==0)...
else ...
当然,这是C语言的库函数,它的代码存储在某个库文件中。
在string.h里只是一个声明。
我给你写一下,大概是这样的:
int strcmp(const char *str1,const char *str2)
{
char *str3=str1,*str4=str2;
while(*str3++!=*str4++&&(*str3||*str4))
{
if(*--str3<*--str4)
return -1;
if(*str3>*str4) return 1;
str3++;str4++;
}
return 0;
}
网页链接
page ,132
title strcmp.asm - compare two strings
;***
;strcmp.asm - routine to compare two strings (for equal, less, or greater)
;
; Copyright (c) Microsoft Corporation. All rights reserved.
;
;Purpose:
; STRCMP compares two strings and returns an integer
; to indicate whether the first is less than the second, the two are
; equal, or whether the first is greater than the second, respectively.
; Comparison is done byte by byte on an UNSIGNED basis, which is to
; say that Null (0) is less than any other character (1-255).
;
;*******************************************************************************
.xlist
include cruntime.inc
.list
page
;***
;strcmp - compare two strings, returning less than, equal to, or greater than
;
;Purpose:
; Compares two string, determining their lexical order. Unsigned
; comparison is used.
;
; Algorithm:
; int strcmp ( src , dst )
; unsigned char *src;
; unsigned char *dst;
; {
; int ret = 0 ;
;
; while( ! (ret = *src - *dst) && *dst)
; ++src, ++dst;
;
; if ( ret < 0 )
; ret = -1 ;
; else if ( ret > 0 )
; ret = 1 ;
;
; return( ret );
; }
;
;Entry:
; const char * src - string for left-hand side of comparison
; const char * dst - string for right-hand side of comparison
;
;Exit:
; AX < 0, 0, or >0, indicating whether the first string is
; Less than, Equal to, or Greater than the second string.
;
;Uses:
; CX, DX
;
;Exceptions:
;
;*******************************************************************************
CODESEG
public strcmp
strcmp proc \
str1:ptr byte, \
str2:ptr byte
OPTION PROLOGUE:NONE, EPILOGUE:NONE
.FPO ( 0, 2, 0, 0, 0, 0 )
mov edx,[esp + 4] ; edx = src
mov ecx,[esp + 8] ; ecx = dst
test edx,3
jnz short dopartial
align 4
dodwords:
mov eax,[edx]
cmp al,[ecx]
jne short donene
or al,al
jz short doneeq
cmp ah,[ecx + 1]
jne short donene
or ah,ah
jz short doneeq
shr eax,16
cmp al,[ecx + 2]
jne short donene
or al,al
jz short doneeq
cmp ah,[ecx + 3]
jne short donene
add ecx,4
add edx,4
or ah,ah
jnz short dodwords
align 4
doneeq:
xor eax,eax
ret
align 4
donene:
; The instructions below should place -1 in eax if src < dst,
; and 1 in eax if src > dst.
sbb eax,eax
sal eax,1
add eax,1
ret
align 4
dopartial:
test edx,1
jz short doword
mov al,[edx]
add edx,1
cmp al,[ecx]
jne short donene
add ecx,1
or al,al
jz short doneeq
test edx,2
jz short dodwords
align 4
doword:
mov ax,[edx]
add edx,2
cmp al,[ecx]
jne short donene
or al,al
jz short doneeq
cmp ah,[ecx + 1]
jne short donene
or ah,ah
jz short doneeq
add ecx,2
jmp short dodwords
strcmp endp
end
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函数
</s2时,返回值
C语言中:strcmp函数如何使用?
#include
#include
int main()
{
char ch1[2] = "a";
char ch2[2] = "k";
int result = strcmp(ch1, ch2);
if( result > 0 )
{
printf("a要大\n");
}
else if( result < 0 )
{
printf("k要大\n");
}
else
{
printf("相等\n");
}
return 0;
}
单个字符的话其实可以直接比较,strcmp是比较字符串的,返回值是他们的差值,如果等于0说明相等。其他可以参考百科或MSDN
函数原型:extern int strcmp(const char *s1,const char *s2);
函数功能:以ascii码值比较两个字符串的大小,当s1
s2时,返回正数。
头文件:#include
参数说明:两个比较字符串的首地址指针。
注意事项:strcmp(const char *s1,const char * s2)这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。
就是对两个字符串从左到右逐个字符相比,按ASCII值大小比较,如果出现不同字符或遇到'\0'为止,如果全部字符相等;则认为相等,如果不相等的,按第一个不相等的字符的比较结果为准,
如strmp(str,str),则函数值为0,如果strmp(stra,strb)因为a的askii小于b的,所以函数值为一个负数。
strcmp简介:
函数原型int strcmp(const char *str1,const char *str2);
其作用为
将str1的各个字母的ASCII码与str2的进行比较。
若str1>str2则返回整数,若str1=str2返回0,否则,返回负数
一般这样调用:
if(strcmp(str1,str2)==0)...
else ...
当然,这是C语言的库函数,它的代码存储在某个库文件中。
在string.h里只是一个声明。
我给你写一下,大概是这样的:
int strcmp(const char *str1,const char *str2)
{
char *str3=str1,*str4=str2;
while(*str3++!=*str4++&&(*str3||*str4))
{
if(*--str3<*--str4)
return -1;
if(*str3>*str4) return 1;
str3++;str4++;
}
return 0;
}
字符串比较函数,两个字符串,从第一个字符开始比,如果相同,继续向下比,如果不同,看这两个字符的ASCII码,如果第一个字符串的比较大,则返回1,否则返回-1;
原型:extern int strcmp(const char *s1,const char * s2);
用法:#include
功能:比较字符串s1和s2。
相关函数:wcscmp
一般形式:strcmp(字符串1,字符串2)
说明:
当s1
<s2时,返回值<0
当s1=s2时,返回值=0
当s1>s2时,返回值>0
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如:
"A"<"B" "a">"A" "computer">"compare"
特别注意:strcmp(const char *s1,const char * s2)这里面只能比较字符串,不能比较数字等其他形式的参数。
</s2时,返回值<0
C语言编程strcmp函数的问题
如果a>b,strcmp(a,b)返回的是>0;
如果a==b,strcmp(a,b)返回的是0;
如果a
<b,strcmp(a,b)返回的是<0;
你可以方便记忆成strcmp(a,b)的结果就是a-b。a比较大的话结果自然就是>0
#include
#include
int main()
{
char str1[100],str2[100];
printf("input 2 strings: ");
scanf( "%s %s", str1,str2 ); /eg: hello world
if(strcmp(str1,str2)< 0)printf("str1
<str2");
else if(strcmp(str1,str2) > 0)printf("str1 > str2");
else
printf("str1 == str2");
printf("\n");
return 0;
}
if(strcmp(str1,str2)==0)printf("str1==str2");
strcmp()函数原型是
int strcmp(const char *s1,const char *s2)如果s1的字符串在机器编码顺序中落后于s2,函数返回值是一个大于0的整数;如果两个字符串相同的话,返回值是0;如果第一个字符串在机器编码顺序中先于第二个字符串,返回值是一个<0的数。
看函数的返回值类型是 int,那么你就可以定义一个int 值来表示,例如
int cmp=strcmp(s1,s2)cmp>0说明s2>s1;
cmp=0说明s2=s1;
cmp<0说明s2
<s1;
或者可以直接使用
if(strcmp(str1,str2))作为判断条件。
</s1;
</str2");
</b,strcmp(a,b)返回的是<0;
c语言定义函数实现strcmp功能
void main()
{
char a[10],b[10],c[10];
gets(a);
gets(b);
c[0]=strcmp(a,b); //返回值只有一个字符
printf("%c",c[0] );
}
在C语言中可以通过定义一个函数来实现这个功能,比如:
int compare(char a[22],b[22])
{
int i=0;
while(a[i]==b[i]&&i<22)
i++;
if(i==21) return 1;
else return 0;
}
就这么多就行了,strcmp函数返回的值是如果比较相同则返回0,否者返回非零值,上面我定义的函数遵循这一规则。
用的时候有两种方法:
1》先声明,后主函数调用,再最后写上上面的定义函数
2》先定义上面的函数,主函数直接调用(这样不用声明了)
C语言编程-用数组方法编写函数strcmp,比较两个字符串的大小。
#include
#include
char
*fun(char
*s,char
*t)//对两个字符串比较
{
char
*ss=s,*tt=t;
while((*ss)&&(*tt))
{
ss++;tt++;
}
if(*tt)
return(t);
else
return(s);
}
main(){
char
a[20],b[10],*p,*q;
int
i;
printf("Input
1th
string:");
gets(a);
printf("Input
2th
string:");
gets(b);
printf("%s\n",fun(a,b));
//打印结果
system("pause");
}
C语言 不使用库函数,编写函数strcpy和strcmp
#include
// 将字符串s中的内容拷贝到d中,包括字符串结束符'\0'
char *strcpy(char *d, constchar *s)
{
char *p = d;
while (1)
{
*p = *s;
if (*p == '\0') break;
p++;
s++;
}
return p;
}
// 按ascii码比较字符串a和b的内容大小,a > b返回正整数,a < b返回负整数,a == b返回0
int strcmp(constchar *a, constchar *b)
{
while(*a != '\0' && *a == *b)
{
a++;
b++;
}
return (int)(*a - *b);
}
// 测试这两个自定义函数
int main()
{
char s[20];
char *p = "abc";
char *q = "ab";
strcpy(s, p);
printf("%s\n", s);
printf("%d\n", strcmp(p, q));
return 0;
}
⒈strcpy的实现代码
char * strcpy(char * strDest,const char * strSrc)
{
char * strDestCopy=strDest; //[3]
if ((strDest==NULL)||(strSrc==NULL)) //[1]
throw "Invalid argument(s)"; //[2]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy;
}
int __cdecl strcmp (
const char * src,
const char * dst
)
{
int ret = 0 ;
while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst&&*src)
++src, ++dst;
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
strcpy是32位32位拷的...它的函数流程用C语言表示大概是这样的。
char * _cdecl strcpy1(char * dest,const char * source){
int edx;
int eax;
int ecx = 0;
if(!((int )(&source)&3)){
while(1){
edx = 0x7efefeff;
eax = ((int *)source)[ecx];
edx +=eax;
eax ^=-1;
eax ^=edx;
edx = ((int *)source)[ecx];
if(!(eax = 0x81010100)){
((int *)dest)[ecx] = edx;
ecx+=1;
continue;
}
if(!((char *)(&edx))[0]){
dest[ecx*4+2]=((char *)(&edx))[ecx];
return dest;
}
else if(!((char *)(&edx))[1]){
((int *)dest)[ecx] = (short )edx;
return dest;
}
else if(!((char *)(&edx))[2]){
(((int *)dest)[ecx]) = (short )edx;
dest[ecx*4+2]=0;
return dest;
}
else if(!((char *)(&edx))[3])
{
((int *)dest)[ecx] = edx;
return dest;
}
else
{
((int *)dest)[ecx] = edx;
ecx+=1;
continue;
}
}
}else
return NULL;
}
这是strcpy的,你类似的可以做出strcmp的,思路是通过指针遍历字符串进行操作。
strcpy(a,b):
#include
int main()
{
char a[20]="hello,",b[20]="world!",*p=a,*q=b;
int i=0,j;
while(1)
{
if(*(q+i)==0) break;
i++;
}
for(j=0;j<=i;j++)
{
*(p+j)=*(q+j);
}
printf("%s",p);
system("pause");
return 0;
}
/*
** copy t to s
*/
strcpy(char *s,char * t)
{
char *d;
d = s;
while (*s++ = *t++) ;
return(d);
}
/*
** return <0, 0, >0 aUording to
** s
t
*/
strcmp(char *s,char * t)
{
while(*s == *t) {
if(*s == 0) return (0);
++s; ++t;
}
return (*s - *t);
}
也是在网上看到的,具体的出处找不到了。
1 strcpy为字符串复制函数。
实现strcpy函数,需要将源字符串各个值依次赋值到目标字符串上,到\0为止。
代码如下:
char *strcpy(char *dst, const char *src){ char *p=dst; while(*src) *p++=*src++; *p = '\0'; return dst;}
2 strcmp为字符串比较函数。
int strcmp(const char *a, const char *b);
需要依次对字符串元素按照ascii码值对比,如果完全相同返回0.
如果不同,对第一个不同的字符比较,如果第一个参数的ascii码值较大,则返回1,否则返回-1.
代码如下:
int strcmp(const char *a, const char *b);{ while((*a||*b) && *a==*b) a++,b++; if(*a<*b)return -1; return *a>*b;}
[C语言] 关于strcmp函数的用法。万分感谢!
这样吧,我简单给你说一下你应该就能懂了
"computer">"compare"中computer的第一个字母(c)和compare中的第一个字母(c)比较,如果对应的ASCII相同的话就进行第二个字母的比较,这样依次下去知道比较到不同的或是比较完为止。
而“dbase” “C Language”中第一个字母就不相同了,d对应的ASCII为100,而C对应的ASCII为67,然后就直接停止比较了,所以结果为“dbase”>“C Language”,现在知道了吧
strcmp的函数代码实现模拟为如下:
#include
int
strcmp(char
*str1,char*str2)
{
char
*
p1=str1,
*p2=str2;
while(*p1
&&
*p2)
{
if(*p1>*p2)
{
return
1;
}
else
if(*p1<*p2)
{
return
-1;
}
p1++;
p2++;
}
if(*p1==0
&&
*p2==0)
{
return
0;
}
else
if(*p1==0
&&
*p2!=0)
{
return
-1;
}
else
{
return
1;
}
}
void
main()
{
printf("%d\n",strcmp("hello1","hello"));
printf("%d\n",strcmp("computer","compare"));
printf("%d\n",strcmp("dbase","C
Language"));
}
请自己看代码,也简单。
第一个前面都相等, 比到第5个字符的时候u > a 所以前一个字符串大于后一个
第二个比到第一个字符 d > C 所以前一个比较大
strcmp的函数代码实现模拟为如下:
#include
int strcmp(char *str1,char*str2)
{
char * p1=str1, *p2=str2;
while(*p1 && *p2)
{
if(*p1>*p2)
{
return 1;
}
else if(*p1<*p2)
{
return -1;
}
p1++;
p2++;
}
if(*p1==0 && *p2==0)
{
return 0;
}
else if(*p1==0 && *p2!=0)
{
return -1;
}
else
{
return 1;
}
}
void main()
{
printf("%d\n",strcmp("hello1","hello"));
printf("%d\n",strcmp("computer","compare"));
printf("%d\n",strcmp("dbase","C Language"));
}
请自己看代码,也简单。
1:首先,比较字符c,相同,在比较o,还相同...比较u与a,不同!u的ASC码比a大,立即返回,返回一个正数,后面的就没有必要再比较了
2:道理相同,d的ASC比C大,所以立即返回
明白了没?
strcmp的原型是int strcmp(const char *s1, const char *s2),s1、s2都被const修饰,可见函数体中对两个字符串进行只读操作。
比较从左至右按字符一一对应进行,遇到不等时得出结果,停止操作;无论哪个字符串先到达'\0','\0'也参与比较。
当s1的某个字符的ASCII值>s2对应字符的ASCII值时,函数返回+1,反之返回-1,当s1、s2完全一样(等长,对应字符相同)时返回0。
举例代码如下:
//#include "stdafx.h"//If the vc++6.0, with this line.#include "stdio.h"#include "string.h"int main(void){ char *s1="12345fjksld;ajfkl;",*s2="12a",*s3="12a"; printf("s1<-->s2: %d\n",strcmp(s1,s2));//输出-1,说明大小不由长度确定 printf("s2<-->s3: %d\n",strcmp(s2,s3));//长度和字符对应相等是才输出0 printf("s2<-->s1: %d\n",strcmp(s2,s1));//是参数1与参数2对比而不是相反 printf("\n"); return 0;}
C语言字符串处理函数strcmp
原型:extern
int
strcmp(char
*s1,char
*
s2);
用法:#include
功能:比较字符串s1和s2。
说明:
当s1
s2时,返回值>0
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
长度>元素个数的时候,由于a[5]位置为\0。所以函数结束返回0。
长度=元素个数的时候,由于字符串最后\0结束字符没有空间放了。比较a[5],b[5]空间的字符时候,就无法确定大小了。
长度>元素个数的时候,可以查看a[5]和b[5]的ASCII值,为0.
strcmp是比较古老的函数了,它就是在检查'\0'为结尾的字符串,你的字符数组位置为5时,没有位置来存储'\0',所以函数strcmp检查时候不会停止,会继续向后面检查(后面的地址没有赋值,都是随机的数,直到遇见'0'),所以不会相等。