UDP广播协议叫吃饭


私信TA

用户名:Mustenaka

访问量:149584

签 名:

个人博客www.mustenaka.cn

等  级
排  名 13
经  验 25386
参赛次数 8
文章发表 197
年  龄 3
在职情况 学生
学  校 Sky_box
专  业 NE

  自我简介:

欢迎光临我的博客www.mustenaka.cn,Python,C#,U3D,C/C++开发合作可以找我

参考代码:

#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一样调用就可以了。

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

 

0.0分

7 人评分

  评论区

不愧是大佬!排名11!
2020-07-07 21:29:25
woc,很皮
2020-03-14 19:32:55
  • «
  • 1
  • »