参考代码:

#include<stdio.h>
#include<string.h>
#define maxn 10005
int main(){
	char a[maxn],b[maxn];
	scanf("%s %s",a,b);
	printf("%d",strcmp(a,b));
	return 0;
}

好了写完了,拜拜....




诶诶你们干什么???

你们干啥啊????

不要打我啊~~~

啊........ヽ(*。>Д<)o゜



咳咳。。!

好了正经一点发点点东西吧。

strcmp是C语言比较两个字符串的比较函数,C++string符号重载之后可以直接用==进行类似判定,这里不说C++,我们来聊聊C语言strcmp的实现吧。


strcmp函数是C/C++中基本的函数,它对两个字符串进行比较,然后返回比较结果,函数形式如下:

int strcmp(constchar*str1,constchar*str2);

其中str1和str2可以是字符串常量或者字符串变量,返回值为整形。返回结果如下规定:
①str1小于str2,返回负值或者-1(VC返回-1);

②str1等于str2,返回0;
③str1大于str2,返回正值或者1(VC返回1);

strcmp函数实际上是对字符的ASCII码进行比较,实现原理如下:首先比较两个串的第一个字符,若不相等,则停止比较并得出两个ASCII码大小比较的结果;如果相等就接着比较第二个字符然后第三个字符等等。无论两个字符串是什么样,strcmp函数最多比较到其中一个字符串遇到结束符'/0'为止,就能得出结果。


但是我们需要注意的一些事情有,进行判断的时候需要使用Unsigned char无符号字符型进行判断,这是因为传入的参数为有符号数,有符号字符值的范围是-128~127,无符号字符值的范围是0~255,而字符串的ASCII没有负值,若不转化为无符号数这回在减法实现时出现错误。例如str1的值为1,str2的值为255。


作为无符号数计算时ret=-254,结果为负值,正确作为有符号数计算时ret=2,结果为正值,错误


int strcmp_new(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;
}

此外还有一些别的方法,就是不需要ret去计算两者之差,直接取值进行判断

int strcmp( const char *str1, const char *str2 ) {
	while( (*str1) && ( *str1 == *str2 ) ) {
		str1++;
		str2++;
	}
	if( *(unsigned char*)str1 > *(unsigned char*)str2 )
		return 1;
	else if( *(unsigned char*)str1 < *(unsigned char*)str2 )
		return -1;
	else
		return 0;
}

当然发现本题目不是很严谨的去考虑符号的问题,对于初学者可以像我这样子解决本题目,那就是变为常规的字符判断,其实与上文的方法是一样的,只不过感觉上简单了一丢丢。

int ncmp(char *a,char *b){
	while((*a)&&(*a==*b)){
		a++;
		b++;
	}
	if(*a>*b){
		return 1;
	}else if(*a<*b){
		return -1;
	}else{
		return 0;
	}
}

用的时候直接像strcmp一样调用就可以了。

具体主函数怎么写就不写了。

点赞(1)
 

0.0分

5 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

陈妍悦 4年前 回复TA
不愧是大佬!排名11!
zjing 4年前 回复TA
woc,很皮