C语言判断两个结构体是否相等

一、不能通过函数memcpy或"=="来判断两个结构体是否相等:

typedef struct o_compile
{
    char compile[50];//编译选项
    float odds;//编译选项出现的概率
} Compile;

Compile s1,s2;
strcpy(s1.compile,"hellowold");
s1.odds = 0.12;
s2 = s1;//可以通过“=”进行赋值操作,但是不能通过“==”判断是否相等

而函数memcpy来判断两个结构体是否相等:memcmp函数是逐个字节进行比较的,而struct存在字节对齐,字节对齐时补的字节内容是随机的,会产生垃圾值,所以无法比较。

解决方法:

通过写一个判断函数比较结构体中的成员是否相等:

bool eq(Compile s1,Compile s2){
    if(strcmp(s1.compile,s2.compile) == 0 && s1.odds == s2.odds){
        return true;
    }
    return false;
}
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
水仙花数的vfp实现 时间:2009-05-08来源:编程入门网 作者:老马   本文作者“老马”为编程入门网VFP专栏作家,转载请保留这句话。   记得看过朋友的文章中有句话大致是这个意思:一个人编程的水平与实现同一目的所需的代码数量成反比。其实这句话很有道理,如果用这个观点来评价我自己,我应该是一个苍老的菜鸟,我做出来的东西勉强可用,但代码在高手看来却是惨不忍睹。我所走过的轨迹与常人大概也有所不同:计算机专业科班的可能在毕业后从事coding多年之后,当感觉自己力不从心时转行做管理或教师;而我恰恰相反,外贸专业毕业后狂热地自学了一些东西,教了几年C语言、vb、vfp及asp等课程,几乎所有的业余时间都用到了接活来做上,这一点也差不多达到了狂热的程度。不过后来发现自己似乎是走进了死胡同:我试图走进VC的世界,可是被MFC、SDK这些东西折磨得痛苦之极;当我为自己开始能用asp做些东西而沾沾自喜的时候,一个强调代码与界面分离的asp.net一天比一天时髦起来,而它的身后是一个.NET家族。更新的技术何时出现?天知道,或许就在明天。我终于开始明白,我实际并不象身边的人说的那样聪明,我也只是一个平庸的人;我终于开始明白,如果在我所从事的这个没有任何保障的“挨踢”行业继续做下去,过几年我会成为40、50人员,那时恐怕连愿意为我交社保、医保的地方都找不到了。所以现在我进入了企业,不再是教师,因为这需要很大的精力来证明自己的能力和水平;也不再为了些“水票管理”之类的东西而通宵达旦,因为这样做得到的是几个小钱,失去的却是最宝贵的健康。   今天和几个高中同学小聚了一下,或许是人岁数大了愿意回忆从前的事,或许是还有些酒意,所以有了上面的这一段话。不过我想这不应该算是牢骚,应该说是一个菜鸟对自己的可笑经历的总结。   我始终认为C语言是一个基础性的语言,以前无论是VB或VFP课,我总会要求同学自己找本谭浩强的《C程序设计》,把预处理命令、指针、结构与共用等几部分内容pass过去,阅读其基础部分的内容;而在课时充足的情况下,我也会经常拿C程序书中诸如“鸡兔同笼”这样有趣的题来“折磨”一下班上的同学。   而现在有些日子了,有两个高中同学总跑到我家里来。人活到老、学到老,这本是件好事,不过我还是有些苦恼。因为他们到我家里来学习,不仅不交学费,我还得管他们饭。他们问到的vfp的东西比较多,所以我打算继续把这方面的一些东西翻出来晒晒。从本文开始会探讨一下C程序书中比较经典的几个算法在VFP中实现的问题,当然纯属菜鸟之见,有没有用那可两说,得自己去分析。觉得有用的话,或许可以开拓思路、扩充您的知识面,我很高兴;觉得没用的话,您权当我是吃撑了,您能忍受我罗嗦了这么长时间,我一样很高兴,呵呵。   水仙花数的实现是一个比较经典的算法题,今天我们首先在vfp中来实现它。   首先我们了解一下什么是“水仙花数”。所谓水仙花数是指一个n位数,其各位数字立方和等于该数本身的值,例如:153=13+53+33 ,所以153是一个水仙花数。   我们来做一个简单点儿的:求解3位数的水仙花数,即100至999之间的水仙花数。很明显这个程序需要使用循环,并且从水仙花数的概念可知,其重点是求解出循环变量当前值的各位数字的值。剩下的工作就简单了,把求解出的各位数字的立方和与循环变量当前值进行比较,如果相等则说明这是一个水仙花数,输出它即可。相关说明见代码注释。本文发表于编程入门网:www.bianceng.cn   我们用表单来实现这个例子,运行时如下图:   参照上图开始我们的制作:   一、新建表单,向表单上添加一个标签控件,caption属性值设置为“显示100到999间的水仙花数”;添加两个命令按钮command1和command2,并将它们的caption属性值分别设置为“开始”和“清除”;添加一个编辑框控件Edit1,属性值均采用默认的。   二、添加事件代码:   1、“清除”按钮的click事件: thisform.edit1.value="" thisform.refresh   2、“开始”按钮的click事件: local i,a,b,c for i=100 to 999 a=int(i/100) &&百位的值等于这个三位数除以100后取整 b=int((i-100*a)/10) &&用这个三位数减去它的百位数字与100乘积, &&对得到的差除以10后进行取整,结果就是十位的值 c=i-int(i/10)*10 &&与上面原理相同,这是求个位的值 if i=a^3+b^3+c^3 &&成立说明是水仙花数并输出 thisform.edit1.value=thisform.edit1.value+str(i,5)+chr(13) &&用chr(13)换行 endif endfor
计算机课程实习报告 ———————————————————————————————— 作者: ———————————————————————————————— 日期: 计算机网络综合实习 实验题目:编写计算机程序,用(目的网络,掩码,下一跳)的结构表示路由表,以一个目 的地址作为输入,顺序查找路由表,找出正确的下一跳,并输出。 原理概述: 首先,将各目的网络与子网掩码按位与得目的子网,其次在将输入的网络与子网掩码 相与获得一个新的目的子网,再比较两个目的子网如果相等则输出与目的网络相对应 的下一跳。如果不等则再将输入的网络地址与其它子网掩码相与与其目的子网比较直 到找到相匹配的目的网络输出下一跳。如果与所有的目的网路比较后仍没有匹配的则 输出默认端口。 设计方案: 四、 程序: #include<stdio.h> #include<string.h> struct rip { int amid[4][4]; int subnet[4][4]; char next[4]; int sub[4][4]; };//定义路由器的结构 void main() { int a[4]; int i,j,k; int temp; struct   rip r={128,30,33,0,128,30,33,128,128,30,36,0,0,0,0,0,255,255,255,1 28,255,255,255,128,255,255,255,0,0,0,0,0,'a','b','c','默认' }; printf("目的网络地址   子网掩码  下一跳 \n"); printf("...................................................... ...\n"); for(i=0;i<4;i++) { printf("%d.%d.%d.%d\t%6d.%d.%d.%d\t%6c\n",r.amid[i][0],r.amid[i][1 ],r.amid[i][2],r.amid[i][3],r.subnet[i][0],r.subnet[i][1],r .subnet[i][2],r.subnet[i][3],r.next[i]); }//输出路由表 printf("输入网络地址:\n"); scanf("%d.%d.%d.%d",a,(a+1),(a+2),(a+3));//输入网络地址 j=0; for(i=0;i<3;i++) { for(j=0;j<4;j++) {  r.sub[i][j]=r.amid[i][j]&r.subnet[i][j]; } //printf("%d.%d.%d.%d",r.sub[i][0],r.sub[i][1],r.sub[i][2],r.s ub[i][3]); }//求出目的子网 printf("\n"); i=0,k=0; for(;(i<4)&&(k==0);i++) {    for(j=0;j<4;j++) { temp=a[j]&r.subnet[i][j];//求输入网络与子网掩码相与 if(temp !=r.sub[i][j])           break; else    if(j==3) {       printf("下一跳:\t");       printf("%c\n",r.next[i]); k=1; break; }     else             continue; }//寻找匹配的网络地址并输出端口 } switch (i) { case 3: printf("下一跳:\t"); printf("%c",r.next[i-1]); default : break; }//如果没有则跳到默认端口 } 运行结果: 实验心得和会: 这次对计算机网络的实习让我会到看到自己编写的程序在运行出来的那一刻的喜悦 和兴奋。刚开始时并没有想到自己会编出这个程序,起初只是抱着试一试的心态。可当自 己编程时虽然心中已经有了如何实现的算法可是将它用C编译时却遇到了很多困难,例如 路由表的输出、网络地址的输入等。虽然遇到了这些困难,但是通过在和薛天林的探讨 中不断 不断找出解决问题的方法,最终实现这个程序,也让自己的C语言基础得到了巩固。不过 程序也存在不足,当与第三个目的网络匹配时输出下一跳输出两次,这应该与switch的 天条件I有关。 这个程序是在我的课程实习中第一次由自己编译并运行成功。其实无论是多么复杂的 程序只要将它细化最后总是归结到一些很简单的语句拼凑成的。在编译的过程中会有很 多问题的出现,而这些问题的出现总是引导着我去寻找解决它的方法,引导着我对C的认 识更深入。虽然这是程序就短短四五十行,但它的成功让我不再见到程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值