首页 > 试题广场 >

下面函数的功能是 int fun (char *s)

[单选题]
下面函数的功能是
int fun (char *s)
{
    char *p=s;
    while(*p++);
    return p-s-1;
}
  • 计算字符串的位(bit)数
  • 复制一个字符串
  • 求字符串的长度
  • 求字符串存放的位置
推荐
C
while(*p++); //此句执行结束,p指向的是字符串末尾的"\0"
此时s仍然是指向字符串的开头
所以 p-s-1是求字符串的长度,-1就是去掉"\0"的长度1

编辑于 2015-02-04 17:53:48 回复(10)
int fun (char *s)   //此处可知,返回值类型为整形int;
{
    char *p=s;     //将s的值赋值给p,即p和s同指向某一个地址;
    while(*p++);  //这条语句为这道题的坑,即循环体是分号。。。只要(*p++) != 0,就一直向后移动,直至p指向字符串末尾的"\0";
    return p-s-1; //此时,p指向字符串的末尾(\0的位置),s指向字符串的头,则,p-s-1就是字符串的长度,-1就是去掉"\0"的长度1
}
发表于 2015-10-27 22:17:20 回复(3)
while(*p++);  
执行完该行时,p指向s末尾'\0'之后的地址:
p指向 '\0'时,跳出while循环,之后再执行一次p++,
因此此时p不再指向 '\0',而是其后面的地址

发表于 2016-09-09 23:08:07 回复(0)
int fun (char *s)
{
char *p=s;/*将S的地址给p;
while(*p++);/*没有遇到/0的时候p一直增加
return p-s-1;/*原始地址与增加后的地址的差减掉/0的长度
}
编辑于 2015-06-25 16:07:49 回复(1)
假如指针p指向 "abcd"
while(*p++); 
-----------------------------------------------------------------------------------------------------------------------------
// *p++指向a(判断未结束++还未生效)
// while('a') 括号内判断为真,(判断结束++生效,*p++指向b),继续下一个判断

// *p++指向b(判断未结束++还未生效)
// while('b') 括号内判断为真,(判断结束++生效,*p++指向c),继续下一个判断
....
// *p++指向'\0'(判断未结束++还未生效)
// while('\0') 括号内判断为假,(判断结束++生效,*p++指向‘\0’的下一个(不知道是什么,只知道是\0的下一个)) while结束
-----------------------------------------------------------------------------------------------------------------------------
因为p指向\0的下一个,这个要去掉,我们只要到\0就可以了,所以p-s-1为字符串的长度
发表于 2017-08-29 17:41:49 回复(0)
失误了,地址差为字节数,误认为是位数了。后一个字节的地址减前一个字节的地址为1,而不是8.
发表于 2017-08-13 17:15:23 回复(1)
*p++优先级一样,但是结合方向是从右向左,所以最后早减去1
发表于 2016-08-15 00:23:10 回复(0)
p++是先把p的值拿来用,然后在自增1 ++p是想把p自增1然后拿来用
编辑于 2018-09-27 00:21:50 回复(0)
while(*p++)不是先赋值,下条语句再自加吗?
发表于 2017-04-01 15:23:54 回复(0)
字符串位数和字符串长度是什么区别??
发表于 2016-09-13 09:14:31 回复(0)
NWU头像 NWU
编辑于 2016-08-15 18:17:12 回复(3)
我的观点:*p++的优先级问题,应该先和p++结合,使得指针一直往后移动,直到遇见\0,然后*p,取到最后一个元素。然后p代表最后一个元素的位置。-1是因为默认的\0也占位置。
如果不对,请指明错误
发表于 2019-04-25 10:30:05 回复(0)
只有while判断条件为0时,才会不进入while循环中
发表于 2019-04-03 09:30:08 回复(0)
关键点在于理解 *p++ 的运行过程,比如 int num = *p++,实际运行过程为先执行 num = *p;  再执行 p = p + 1; 
具体详解可以参考我写的一篇博客,有问题可以互相交流学习。博客链接如下:
发表于 2018-10-09 15:59:15 回复(0)
int fun (char *s)
{
char *p=s;
while(*p++);  //先执行*p,然后在执行p++.【注意】当*p=‘\0’时,虽然while会推出,但是p++仍然执行下去,这时的p就是\0的下一个地址,所以p-s-1的1就是这个。
return p-s-1;
}
编辑于 2018-03-28 22:06:45 回复(0)
我觉得减去1是因为最后p指针指向'\0'的后一位
发表于 2018-01-12 16:25:56 回复(0)
本题注意while语句,{}内才是包含在while语句内执行的部分,容易忽略
发表于 2017-08-21 14:35:08 回复(0)
int fun (char *s)
{
    char *p=s;    // p指向s的首地址
    while(*p++);   // 相当于(p++),当p指向'/0'时,终止while循环
    return p-s-1;   // 此时,p指向'/0'的下一个地址,s指向字符串首地址,(p-s-1)正好得出字符串的长度
}
PS:地址相减得出的是相差元素的单位个数,并不是地址的数量差值。
编辑于 2017-08-20 16:52:54 回复(0)
int fun (char *s)   //此处可知,返回值类型为整形int; {     char *p=s;     //将s的值赋值给p,即p和s同指向某一个地址;     while(*p++);  //这条语句为这道题的坑,即循环体是分号。。。只要(*p++) != 0,就一直向后移动,直至p指向字符串末尾的"\0";     return p-s-1; //此时,p指向字符串的末尾(\0的位置),s指向字符串的头,则,p-s-1就是字符串的长度,-1就是去掉"\0"的长度1 }
发表于 2017-06-08 20:26:49 回复(0)
我觉得应该是在while里判断了p指向末尾的\0 之后,*p++还加了一次,所以就要再减1
发表于 2017-04-01 09:12:42 回复(0)
发表于 2017-03-02 11:06:45 回复(0)