黑马程序员技术交流社区
标题: 字符串练习中的疑问 [打印本页]
作者: 薇Grace 时间: 2015-5-14 15:44
标题: 字符串练习中的疑问
我始终搞不懂下面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';
}
作者: 丶浩浩丶 时间: 2015-5-14 22:21
本帖最后由 丶浩浩丶 于 2015-5-14 22:24 编辑
首先 你这个代码是有问题的,我不知道为什么没有造成死循环,但是你可以在下面那个函数里打印一下i试试,应该有好几万,我试了一下 是2万多,证明while循环了两万多次.
我给你改了一下,注释了,你看下
- #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;
-
- //这里要写成str[i]
- while ( str[++i] != c && str[i] != '\0' );
- printf("%d\n",i);
-
- //这里也是,要写成str[i]
- //return str[i] == '\0' ? 0 : 1;
- return str[i] != '\0';
- }
复制代码
那接下来说你不理解的地方.
让while停止的条件是不是有两个
1.就是你要找的那个字符在字符串里
2.就是str=='0';
OK,那现在"itcast"里面是不是有't'这个字符.
很明显,有的,那就我上面说的第一个条件成立了.那就是证明2没有成立,因为这个代码不存在两个同时成立的情况
既然2没有成立是不是证明了str != 0;
那你return的那个条件就是str != 0,这个时候str确实不为0,那就是条件为真,那就是1.条件为真是1,条件为假是0,这个你应该清楚把.
作者: 薇Grace 时间: 2015-5-14 23:40
那个错误应该是复制时弄错了,不好意思。我还是没弄懂。而且你的24行干嘛多出来一个printf?原函数里是没有的。 我懂得你说的让while停止的2个条件,“itcast”包含‘t’字符时,自然就终止了,然后执行下一句return str != '\0'; 为什么这里就会输出1呢? 还有如果“itcast”不包含‘o’字符时,遍历完整个“itcast”while循环还会停止啊,然后也执行return str != '\0'?
作者: 薇Grace 时间: 2015-5-14 23:43
忽然间又明白了,原来1和0的输出是因为return 的值str != '\0' 的真假性啊,谢谢你!
作者: 丶浩浩丶 时间: 2015-5-15 00:06
我那个是打印i,看看循环多少次的
每个字符串都包含'/0',这是字符串结束的标志,
作者: hehelaicaicai 时间: 2015-5-15 09:17
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。
作者: 薇Grace 时间: 2015-5-15 11:13
谢谢你,我明白啦!看你等级和我差不多,怎么比我聪明这么多?
作者: 薇Grace 时间: 2015-5-15 11:15
你的技术分是怎么弄起来的? 25分了耶。教教我呗。
作者: hehelaicaicai 时间: 2015-5-15 12:53
我是前天刚注册的,时间短
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |