c语言中strcmp(p->name,s)是什么意思?

网上看的c语言做学生管理表中的一个查找函数,其中有一段判断输入的名字与管理表中的数据一不一样,但是strcmp使用时不是要判断大于零小于零或者等于零的情况的吗?我知道的是if语句不用判断。而这个我真的不懂,会不会是网上那个源代码错了?下面是那一部分源代码。
/*查找记录函数*/
void search(STUDENT *head)
{STUDENT *p; /* 移动指针*/
char s[5]; /*存放姓名用的字符数组*/
clrscr();
printf("请输入个姓名来查找. Please enter name for searching.\n");
scanf("%s",s);
p=head; /*将头指针赋给p*/
while(strcmp(p->name,s) && p != NULL) /*当记录的姓名不是要找的,或指针不为空时*/
p=p->next; /*移动指针,指向下一结点*/
if(p!=NULL) /*如果指针不为空*/
{printf("\n*************************************FOUND************************************\n");
printf("-------------------------------------------------------------------------------\n");
printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |\n");
printf("-------------------------------------------------------------------------------\n");
printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",
p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
printf("-------------------------------------------------------------------------------\n");
printf("***************************************END**************************************\n");
}
else
printf("\n没有该学生 There is no num %s student on the list.\n",s); /*显示没有该学生*/
}

p=head; /*将头指针赋给p*/
while(strcmp(p->name,s) && p != NULL) /*当记录的姓名不是要找的,或指针不为空时*/
{
p=p->next; /*移动指针,指向下一结点*/
}
这样会看的更清楚

这是单向链表搜索.
strcmp(str1,str2) 函数用来比较两个string ,返回一个int 值来表示这两个 string 的关系。
如果两个string相等, 返回0, 如果不等就返回第一个不等的字符的关系。例如:
strcmp("abc","abc") 两个string相等,所以返回值为 0 ;
strcmp("abc","acc") 两个string不等,第一个不等的字符是'b' 和 ‘c’, 而‘b' 的ascii吗值小于c,所以函数返回一个小于0的整数, 具体是几,你不用关心,因为不一定是几,但一定小于0.表示第一个string小于第二个string。
strcmp("acc","abc") string不等,结果和上面相反,返回一个不一定是几的正整数。

而在c语言中,因为没有布尔类型变量,所以if 靠 所以 bits 的值来判断真假,全零表示假,其他一律为真,简单的说,就是如果if()括号内的表达式为0时为假,其他所有情况都为真(记住是数值0,而不是字符‘0’, 因为字符‘0’的数值不是0. 如果你不明白括号里面的也无所谓。你可以试试
print 0 和 print (int)‘0’ , 你就看出区别了。)

而上面的程序while(strcmp(p->name,s) && p != NULL) 是说,比较用户输入的名字s与p节点的name,如果相等,strcmp返回0, while条件为假,循环结束。

如果s与name不等,strcmp返回一个不为0的整数,条件为真,然后再判断p是不是尾节点,P!=Null 就是判断是不是最后一个节点,如果是最后一个节点,就是说p=null, 那么就返回假,真&&假 为假, 条件为假,循环结束。
如果p!=null,既不是最后一个节点,则返回真,真&&真为真,所以进入循环p=p->next;/*移动指针,指向下一结点*/,而后重复判断while条件,直到找到相同名字,或者链表结束。

你这个函数有一个前提条件,就是头结点head不能为空,如果head节点为空while(strcmp(p->name,s) && p != NULL)这里要出错。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-06-29
strcmp(p->name, s)表示将p指向的地址单元中的与字符串s相比较。

strcmp函数包含在头文件中,调用该函数时,需要添加该头文件,即#include<string.h>

函数原型:extern int strcmp(char *str1,char * str2)
参数说明:str1为第一个要比较的字符串,str2为第二个要比较的字符串。
所在库名:#include <string.h>
函数功能:比较字符串str1和str2。
返回说明:返回整数值:当str1<str2时,<0; 当str1=str2时,返回值=0; 当str1>str2时,返回值>0。这种比较是按照字符的进行比较。
第2个回答  2013-05-13
while(strcmp(p->name,s) && p != NULL) /*当记录的姓名不是要找的,或指针不为空时*/
p=p->next; /*移动指针,指向下一结点*/strcmp()是字符串比较函数,如果两者完全一样返回0,前者大返回1,后者大返回-1。这两句话的意思是:如果姓名不是要找的,即只要不等于0,而且,没有到达末尾,就指向下一个节点。继续查找。直到找到后,strcmp就返回0,然后while循环就跳出了。就可以继续执行后面的话了。
第3个回答  2013-05-13
他前面还有while啊!!!两个字符串一样的话就是0,while遇到0就不循环了ok

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网