A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 薇Grace 中级黑马   /  2015-5-14 15:44  /  888 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我始终搞不懂下面char_contains(char str[], char c)函数中最后的1是怎么返回的。
我只能理解到这句://return str == '\0' ? 0 : 1;
怎样转换为这句我就不知道了:return str != '\0';
请大家帮帮忙,不甚感激!


#include <string.h>
#include <stdio.h>

int char_contains(char str[], char c);

int main()
{

    char name[]  = "itcast";

    int result = char_contains(name, 't');

    printf("%d\n", result);
    return 0;
}

int char_contains(char str[], char c)
{
    int i = -1;

   // 1.遍历整个字符串
    while ( str[++i] != c && str != '\0' ) ;

    //return str == '\0' ? 0 : 1;
    return str != '\0';
}

8 个回复

倒序浏览
本帖最后由 丶浩浩丶 于 2015-5-14 22:24 编辑

首先  你这个代码是有问题的,我不知道为什么没有造成死循环,但是你可以在下面那个函数里打印一下i试试,应该有好几万,我试了一下 是2万多,证明while循环了两万多次.

我给你改了一下,注释了,你看下
  1. #include <string.h>
  2. #include <stdio.h>

  3. int char_contains(char str[], char c);

  4. int main()
  5. {
  6.    
  7.     char name[]  = "itcast";
  8.    
  9.     int result = char_contains(name, 't');
  10.    
  11.     printf("%d\n", result);
  12.     return 0;
  13. }

  14. int char_contains(char str[], char c)
  15. {
  16.     int i = -1;
  17.    
  18.                         //这里要写成str[i]
  19.     while ( str[++i] != c && str[i] != '\0' );

  20.     printf("%d\n",i);
  21.    
  22.     //这里也是,要写成str[i]
  23.     //return str[i] == '\0' ? 0 : 1;
  24.     return str[i] != '\0';
  25. }
复制代码


那接下来说你不理解的地方.

让while停止的条件是不是有两个
1.就是你要找的那个字符在字符串里
2.就是str=='0';

OK,那现在"itcast"里面是不是有't'这个字符.

很明显,有的,那就我上面说的第一个条件成立了.那就是证明2没有成立,因为这个代码不存在两个同时成立的情况

既然2没有成立是不是证明了str != 0;

那你return的那个条件就是str != 0,这个时候str确实不为0,那就是条件为真,那就是1.条件为真是1,条件为假是0,这个你应该清楚把.
回复 使用道具 举报
丶浩浩丶 发表于 2015-5-14 22:21
首先  你这个代码是有问题的,我不知道为什么没有造成死循环,但是你可以在下面那个函数里打印一下i试试,应该 ...

那个错误应该是复制时弄错了,不好意思。我还是没弄懂。而且你的24行干嘛多出来一个printf?原函数里是没有的。 我懂得你说的让while停止的2个条件,“itcast”包含‘t’字符时,自然就终止了,然后执行下一句return str != '\0';  为什么这里就会输出1呢?   还有如果“itcast”不包含‘o’字符时,遍历完整个“itcast”while循环还会停止啊,然后也执行return str != '\0'?
回复 使用道具 举报
丶浩浩丶 发表于 2015-5-14 22:21
首先  你这个代码是有问题的,我不知道为什么没有造成死循环,但是你可以在下面那个函数里打印一下i试试,应该 ...

忽然间又明白了,原来1和0的输出是因为return 的值str != '\0' 的真假性啊,谢谢你!
回复 使用道具 举报
薇Grace 发表于 2015-5-14 23:40
那个错误应该是复制时弄错了,不好意思。我还是没弄懂。而且你的24行干嘛多出来一个printf?原函数里是没 ...

我那个是打印i,看看循环多少次的

每个字符串都包含'/0',这是字符串结束的标志,
回复 使用道具 举报
return str == '\0' ? 0 : 1; 既然你理解这句,那就好办啦。这句的意思是如果str[i]跟'\0'相等,就返回0,不等就返回1。      return str[i] != '\0';  str[i] != '\0'是个表达式,要把计算出来的结果返回回去,如果str[i]跟'\0'相等,那str[i] != '\0'就是假,假就是0。如果str[i]跟'\0'不相等,那str[i] != '\0'就是真,真就是1。
回复 使用道具 举报
hehelaicaicai 发表于 2015-5-15 09:17
return str == '\0' ? 0 : 1; 既然你理解这句,那就好办啦。这句的意思是如果str跟'\0'相等,就返回0,不等 ...

谢谢你,我明白啦!看你等级和我差不多,怎么比我聪明这么多?
回复 使用道具 举报
丶浩浩丶 发表于 2015-5-15 00:06
我那个是打印i,看看循环多少次的

每个字符串都包含'/0',这是字符串结束的标志, ...

你的技术分是怎么弄起来的? 25分了耶。教教我呗。
回复 使用道具 举报
薇Grace 发表于 2015-5-15 11:13
谢谢你,我明白啦!看你等级和我差不多,怎么比我聪明这么多?

我是前天刚注册的,时间短
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马