鱼C论坛

 找回密码
 立即注册
查看: 3741|回复: 6

person[0].name == person[1].name 不等于吗?

[复制链接]
发表于 2012-8-3 09:55:02 | 显示全部楼层 |阅读模式
15鱼币
    int a = 0, b = 0, c = 0, temp, i;
    struct
    {
        char name[20];
    } person[4] = {{0}, {"Mark"}, {"Rick"}, {"Glenn"}};

    printf("欢迎进入良好公民评选系统:\n\n");
    printf("候选人有:Mark, Rick, Glenn\n\n");
    for (i=1; i<NUM+1; i++)
    {
        printf("第%d位投票,请写下支持的候选人的名字:", i);
        scanf("%s", &person[0].name);
        if (person[0].name == person[1].name)
        {
            ++a;   
        }

这是那个投票系统的一部分代码,我的计票方式是,若输入的名字和person[1]、[2]、[3]数组中的某一个相同,就在a,b,c上对应的加1,这一段里只是拿Mark举例,若输入是Mark,则把a加1,可是问题就出在判断上,括号里的person[0].name == person[1].name似乎总是为假,我输入再多的Mark,a依然是0,不执行++a。如果输出person[0].name的话显示是Mark,输出person[1].name也显示是Mark,可if后面括号里的就是为假,请问这是为啥呢? 跟数组有关吗?

最佳答案

查看完整内容

这段代码有很多错误,首先“NUM”要有个值,来确定循环次数,然后“scanf("%s", &person[0].name);”这句中的“&person[0].name”要将取地址符去掉,这相当于数组的数组,person是个数组,name又是个数组,当输入命令里用“%s”时,要用数组名就是person[0].name,不能用取地址操作符,另外person[0].name你已经设置为0了,又怎么可能等于Mark呢?还有name本身是个数组,怎么可以整体引用呢?还有你的name设置的是字符型的 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-3 09:55:03 | 显示全部楼层
本帖最后由 魁拔 于 2012-8-3 11:01 编辑

       这段代码有很多错误,首先“NUM”要有个值,来确定循环次数,然后“scanf("%s", &person[0].name);”这句中的“&person[0].name”要将取地址符去掉,这相当于数组的数组,person是个数组,name又是个数组,当输入命令里用“%s”时,要用数组名就是person[0].name,不能用取地址操作符,另外person[0].name你已经设置为0了,又怎么可能等于Mark呢?还有name本身是个数组,怎么可以整体引用呢?还有你的name设置的是字符型的数组,初始化给person的第一个成员的时候0的两边没有加双引号,系统还以为你将整型的0赋值给了字符型的数组
      如果只需要3个人,那么person数组里的,第一个应该去掉,person数组的长度应该设为3,这个作为比较的“成员”应该放在数组外面,单设个数组,然后用一个for循环,让作为比较的这个数组的每一个元素和被比较的每一个数组的元素比较,直到比较到”\0“,如果都相等才才执行“++a”,还有也可以用”strcmp“函数来比较两个数组是否相同,不过这个要加头文件<string.h>
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-3 11:04:28 | 显示全部楼层
其余的东西你应该自己查资料想,因为填鸭式的教法,不是鱼c论坛倡导的,要有学习的心,也要有思考的心,希望上面的评论可以帮到你{:7_174:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-3 12:25:46 | 显示全部楼层
入楼上所说比较字符串一种是用 strcmp函数。。。你这样比较首先就是错的,还有一种方法比较笨就是 写个循环一个字符一个字符的比较。。。。。。。。。。还有就算用
strcmp  你那里也应该写成 if( strcmp(person[0].name , person[i].name) != 0)  里面要写成 i而不是 1,写成1,。  其余的很多错误如楼上所说、、、
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-3 14:00:02 | 显示全部楼层

RE: person[0].name == person[1].name 不等于吗?


嗯,谢谢这么细致的指出错误,刚学,嘿嘿,还不好。

对于NUM我在前面有#define NUM 10,这里没有粘贴上。
对于scanf("%s", &person[0].name);,&去不去表面上是一样的结果,我以为用scanf的话都面都要用&来着,你这么一说倒是隐约记的小甲鱼好像在讲数组时说过数组这里不用&的。
对于person[0].name设置为0,我是想给它清零,因为我打算用person[0]来接受输入的名字,就想给它清零了,试了下只有让person[0].name = {0}才能使它什么都不表示,即使是char型。当然等于Mark是后来投票输入人名时把人名放在person[0].name里的,这个数组将会被覆盖10次。
对于“person[0].name == person[1].name”可能是你说的不能整体引用所以不行吧,是不?
我用if (strcmp(person[0].name,person[1].name) == 0)来做了。

总之我这方法挺别扭的,新手上路,还望多多指教,嘿嘿~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-3 14:02:36 | 显示全部楼层
Tzdner_C 发表于 2012-8-3 12:25
入楼上所说比较字符串一种是用 strcmp函数。。。你这样比较首先就是错的,还有一种方法比较笨就是 写个循环 ...

我用if (strcmp(person[0].name,person[1].name) == 0)来做了,其余问题在楼上的回复里解释了,你看对不?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-3 21:59:51 | 显示全部楼层
字符串,不是这样比较的,你比的只是2个地址:Q,当然不相等
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-28 03:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表