编写strcmp函数,C语言编程strcmp函数的问题
编写strcmp函数,C语言编程strcmp函数的问题详细介绍
本文目录一览: 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;
帮我写一个简易的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码的差值。
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;
}
int mystrcmp(char* s1, char* s2)
{
while (*s1==*s2)
{
if(*s1=='\0') return 0;
s1++;
s2++;
}
return *s1-*s2;
}
应该可以:
main()
{
char str1[20],str2[20];
int i=0,j=0,flag;
gets(str1);
gets(str2);
while(str1[i]!='\0'&&str2[j]!='\0')
{
if(str1[i++]>str2[j++]) flag=1;
else if(str1[i++]
<str2[j++]) flag="-1;
else flag=0;
}
if(flag==1) printf("str1-str2>0");
if(flag==-1) printf("str1-str2<0");
if(flag==0) printf("str1-str2==0");
getch();
}
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函数是什么样的代码
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函数
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
C语言:编写函数MyStrCmp并用相应主函数进行测试
#include
#define N 100
int MyStrCmp(char * s1, char * s2){
int ret, i=0;
while(s1[i]!='\0' && s2[i]!='\0' && s1[i]==s2[i])
i++;
if(s1[i]==0 && s2[i]==0)
ret=0; //相等
else if(s1[i]==0)
ret=-1; //串s1小于串s2
else if(s2[i]==0)
ret=1; //串s1大于串s2
else if(s1[i]>s2[i])
ret=1; //串s1大于串s2
else
ret=-1; //串s1小于串s2
return ret;
}
int main(){
char s1[N], s2[N];
gets(s1);
gets(s2);
printf("%s\n%s\n",s1,s2);
printf("%d\n", MyStrCmp(s1, s2));
return 0;
}
BOOL MyStrCmp(char* a,char* b)
{
return a[0]>=b[0];
}
#include
#include
int MyStrCmp( char *s1,char *s2 );int main(){ char s1[30], s2[30]; gets(s1); gets(s2); printf("%d\n", MyStrCmp(s1, s2)); return 0;}int MyStrCmp(char * s1, char * s2){ int flag = 0;//0表示相等,1表示s1大于s2,-1表示s1小于s2 int minLength = 0; //较短串的长度 int i = 0; minLength = strlen(s1) >= strlen(s2) ? strlen(s1) : strlen(s2); for(i = 0; i < minLength; i++) { if(s1[i] != s2[i]) { if(s1[i] > s2[i]) flag = 1; else flag = -1; break; } else continue; } return flag;}
C语言编程-用数组方法编写函数strcmp,比较两个字符串的大小。
#include
#include
int compare(char a[],char b[]);
void main()
{
int number;
char str_a[20],str_b[20];//可以根据长度设置
cin>>str_a>>str_b;
number=compare(str_a,str_b);
cout<
<number<<endl;
}
int compare(char a[],char b[])
{
int i;
if(strcmp(a,b)==0)
return 0;
else
{
for(i=0;;i++)
if(a[i]!=b[i]) break;
return (int (a[i]));
}
}
用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");
}
</number<<endl;