strcmp函数代码,C语言 strcmp
strcmp函数代码,C语言 strcmp详细介绍
本文目录一览: C语言 strcmp
经过
char *s1="ABCDEF", *s2="aB"; s1++; s2++;这两条语句后,现在 s1 为"BCDEF",s2 为"B"。
strcmp() 函数功能如下:
strcmp(s1, s2):若 s1==s2,则返回值为零;若 s1
s2,则返回值为某个正数。
大致相当于这段代码(来源 glibc):
intSTRCMP (const char *p1, const char *p2){ const unsigned char *s1 = (const unsigned char *) p1; const unsigned char *s2 = (const unsigned char *) p2; unsigned char c1, c2; do { c1 = (unsigned char) *s1++; c2 = (unsigned char) *s2++; if (c1 == '\0') return c1 - c2; } while (c1 == c2); return c1 - c2;}在这个例子中,进入循环,首先比较第零个字符,发现'B'与'B'相等,继续比较第一个字符,'C'和 0('\0')不相等,跳出循环,最终输出结果为'C'-0=67。
在某些环境下,strcmp() 函数遇到第一个不相等字符时,若 c1>c2 始终输出 1,若 c1
<c2 始终输出 -1,若 c1="=c2" 0,所以最终输出结果为 1。
s1++; s2++;后,s1指向了"ABCDEF"中的B,s2指向了"aB"中B。strcmp比较的是两个字符串,这里就是"BCDEF"和"B",显然前者大于后者,所以输出是1而不是0。
strcmp函数是怎样用的?
strcmp函数用于两个字符串的比较,具体用法如下:
1、strcmp函数接受两个字符串类型的参数传入,根据比较结果返回一个int类型的值。
2、若返回结果的值小于 0,则表示在ASCII码上, str1字符串 小于 str2字符串。
3、若返回结果返回值 大于0,则代表 str2字符串 小于 str1字符串。
4、只有当返回值 为0时,两个字符串才是相同的。
扩展资料:
该函数只能用于比较字符串,不能比较数字等其他形式的参数,否则会报错。
根据ANSI的标准,函数的返回值为正数,负数,0 。不同的C返回的数值会有所不同。当两个字符串不相等时,C的标准没有规定返回值会是 1 或 -1,只规定了正数和负数。
通常情况下,会将两个字符的 ASCII 码之差作为比较结果由函数值返回。因此使用函数进行逻辑判断时应特别注意。
参考资料:
strcmp-百度百科
int strcmp(const char *s1,const char * s2);
所在头文件:string.h
功能:比较字符串s1和s2。
一般形式:strcmp(字符串1,字符串2)
说明:
当s1
<s2时,返回值<0
当s1==s2时,返回值=0
当s1>s2时,返回值>0
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
原型:extern int strcmp(const char *s1,const char * s2);
所在头文件:string.h
功能:比较字符串s1和s2。
一般形式: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)这里面只能比较字符串,不能比较数字等其他形式的参数。
一例实现代码:
#include
#include
#undef strcmp
int strcmp (p1, p2)
{
const char *p1;
const char *p2;
{
register const unsigned char *s1 = (const unsigned char *) p1;
register const unsigned char *s2 = (const unsigned char *) p2;
unsigned reg_char c1, c2;
do{
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0')
return c1 - c2;
}
while (c1 == c2);
return c1 - c2;
}
libc_hidden_builtin_def (strcmp)
strcmp的作用是比较字符串1和字符串2的长度大小的
例如:strcmp(str1,str2);
strcmp("sdkfj″,″Kfnksdj″);
比较的结果由函数值带回
(1)
如果字符串1=字符串2,函数值为0。
(2)
如果字符串1>字符串2,函数值为一正整数。
(3)
如果字符串1
<字符串2,函数值为一负整数。
int ret = strcmp(s1,s2)
如果ret == 0;说明s1和s2相等;
如果ret < 0;说明s1小于s2;
ret > 0;s1大于s2;
strcmp是按照两个字符串的每个字符的asscii码比较的
strcmp函数用法:
strcmp() 用来比较字符串(区分大小写),其原型为:int strcmp(const char *s1, const char *s2);s1, s2 为需要比较的两个字符串。
字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,若差值不为0 则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。
举例:
#include
main(){
char *a = "aBcDeF";
char *b = "AbCdEf";
char *c = "aacdef";
char *d = "aBcDeF";
printf("strcmp(a, b) : %d\n", strcmp(a, b));
printf("strcmp(a, c) : %d\n", strcmp(a, c));
printf("strcmp(a, d) : %d\n", strcmp(a, d));
}
输出结果:
strcmp(a, b) : 32
strcmp(a, c) :-31
strcmp(a, d) : 0
扩展资料:
strcmp使用规则:
一、当两个字符串不相等时,C标准没有规定返回值会是1 或 -1,只规定了正数和负数。有些实现会返回1或-1,但将返回值与1或-1做比较的人,都是不合格的程序。
二、有些会把两个字符的ASCII码之差作为比较结果由函数值返回。但无论如何不能以此条依据作为程序中的流程逻辑。
参考资料来源:百度百科—strcmp
</字符串2,函数值为一负整数。
</s2时,返回值<0
</s2时,返回值<0
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函数
两个字符串自左向右逐个字符相比,出现不同的字符b和B
s1>s2,返回正数;
因为ASCII码中B在b后面
原型:int strcmp(const char firststring[], const char secondstring);
功能:比较两个字符串firststring和secondstring
例程:
#include
#include
void main(void)
{
char buf1[] = "aaa";
char buf2[] = "bbb";
char buf3[] = "ccc";
int ptr;
ptr = strcmp(buf2,buf1);
if(ptr > 0)
cout <<"Buffer 2 is greater than buffer 1"<
<endl;
else
cout <<"Buffer 2 is less than buffer 1"<
<endl;
ptr = strcmp(buf2,buf3);
if(ptr > 0)
cout <<"Buffer 2 is greater than buffer 3"<
<endl;
else
cout <<"Buffer 2 is less than buffer 3"<
<endl;
}
运行结果是:Buffer 2 is less than buffer 1
Buffer 2 is greater than buffer 3
帮我写一个简易的strcmp函数(C语言)。
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);}
① 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码的差值。
strcmp函数 string类型
e..先说明一下,strcmp函数是对于C风格的char* 字符串的操作,而且需要头文件cstring.h
但是string类的话是C++风格的string函数库,需要头文件string.h,他里面已经帮助用户自己实现了函数符的重载,比如你的问题
int e = strcmp(a,"bcd");
对于a string类型操作char*的方法是不行的,你可以定义a为const,这样在函数内部实现的时候可以把string类型转化为char*的
strcmp是标准C的库函数,而string是C++标准库的类,C函数当然不支持C++类的。
唯一的办法就是把
string a = "bcd";换成 char *a = "bcd"; 或者char a[]="bcd";
把第二行改成 int e = strcmp(a.c_str(),"bcd"); 就可以了
strcmp函数:
C/C++函数,比较两个字符串
设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1>str2,则返回正数;
若str1
<str2,则返回负数。
函数原型:
extern int strcmp(const char *s1,const char *s2);
实现代码:
#include
#includ e
#undef strcmp
int strcmp(p1,p2)
{
const char *p1;
const char *p2;
register const unsignedchar *s1=(constunsignedchar*)p1;
register const unsignedchar *s2=(constunsignedchar*)p2;
unsigned reg_charc1,c2;
do{
c1=(unsigned char)*s1++;
c2=(unsigned char)*s2++;
if(c1=='\0')
returnc1-c2;
}while(c1==c2);
return c1-c2;
}
libc_hidden_builtin_def(strcmp)
最正宗的源码
/*strcmp function*/
#include
I
int(strap)(const char *sl,const char *s2)
{
/*compare unsigned char sl[],s2[]*/
for(;*sl==*s2;++sl,++s2)
if(*sl=='\0')
return(0);
return((*(unsignedchar*)sl<*(unsignedchar*)s2)?-1:+1);
}
strcmp另外的源代码如下:
int __cdecl strcmp(const char *src,const char *dst)
{
int ret=0;
while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
++src,++dst;
if(ret<0)
ret=-1;
else if(ret>0)
ret=1;
return(ret);
}
</str2,则返回负数。
strcmp函数怎么写?
int strcmp(const char* str1, const char* str2)
{
int ret = 0;
while(!(ret=*(unsigned char*)str1-*(unsigned char*)str2) && *str1)
{
str1++;
str2++
}
if (ret < 0)
{
return -1;
}
else if (ret > 0)
{
return 1;
}
return 0;
}
要从内存的角度去看这个问题
首先,int
strcmp(char
*s,char
*t)这个函数的参数是2个指针分别指向内存的2个不同位置
for(
;
*s
==
*t;s++,t++)
是使得2个指针比较,相同就向后移动
if(*s
==
0)
return
0
指针为空,返回false.
不为空返回2指针内存的地址差
result = strcmp(char *s, char *t);
比较数组 s 和数组 t 的大小,s>t,result>0;
s=t,result=0;
s
<t,result<0;
int _strcmp(char *s, char *t) /*_strcmp避免与内置函数strcmp冲突*/
{
for(;*s==*t;s++,t++)
if(*s==0)
return 0;
return *s-*t;
}
</t,result<0;
C语言strcmp函数是什么样的代码
1、cmp
是
compare,比较的缩写。
2、strcmp是c语言中头文件
(字符串函数)中定义的一个用于对两组字符串进行比较的函数,它的返回值是int类型。
假设有两组字符串cs和ct,当cs
ct时,函数返回一个正数。
即:两个字符串自左向右逐个字符相比(按ascii值大小相比较),直到出现不同的字符或遇'\0'为止。如:"a"<"b"
,"a">"a"
,"computer">"compare"
,"comput">"comp"
strcmp函数原型为:int
strcmp(const
char
*s1,const
char
*
s2);
strcmp(s1,s2)
相同返回0
当s1
s2时,返回值>0
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如:
"A"<"B"
"a">"A"
"computer">"compare"
特别注意:strcmp(s1,s2)这里面只能比较字符串,不能比较数字等其他形式的参数。
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");
}