我问题个关于 C 语言指针的习题问题,请大家进来看下,顺便复习下字符数组,谢谢!

2015-06-04 23:22:08 +08:00
 zhangchioulin

事情是这样的

我再自学C指针的时候有一道作业
//编写一个int string_len(char *s),返回字符串s的字符长度
我写的代码如下,但是程序一直就直接输出0,请看代码:

include<stdio.h>

int string_len(char *s);
int main()
{
char *name = "qwe";
int len = string_len(name);
printf("%d\n", len);
return 0;
}

int string_len(char *s){
int sum = 1;

do {
    if(*s != '\0'){ //因为字符数组最后一个总归是'\0',所以这句话用来判断是不是最后一个
        sum+=1;     //不是的话SUM+1
    }else{
        return 0;   //是直接返回0,问题就出现在这里程序一直返回0
    }
} while (s++);

// printf("%d\n", s[0]); //被我注释掉了,这句话我用来看指针能不能指向数组的首位

return sum;

}

//另外问大家下怎么在网页中用markdown的代码块?
//一般我都是TAB键,网页下TAB一下直接跳出文本编辑框
//我想总不能一个一个按空格吧,大家怎么解决的?

1887 次点击
所在节点    问与答
20 条回复
billlee
2015-06-04 23:34:40 +08:00
// 你每次碰到 '\0' 就直接返回 0, 当然所有输入都返回 0 啦

int string_len(char *s) {
int size = 0;
while(s[size++]) {}
return size-1;
}
black
2015-06-04 23:38:03 +08:00
//是直接返回0,问题就出现在这里程序一直返回0

题主你都知道这里有问题了,怎么还转不过弯?
...
else {
break;
}
choury
2015-06-04 23:38:04 +08:00
因为你的程序根本走不到
return sum;

学语言的同时也要学习如何debug你的程序
zhangchioulin
2015-06-04 23:41:04 +08:00
@black 哎呀!真的!
zhangchioulin
2015-06-04 23:41:52 +08:00
@choury 用IDE的话会DEBUG但是我是用XCODE加终端的。这个实在不知道怎么DEBUG
zhangchioulin
2015-06-04 23:42:51 +08:00
@billlee 谢谢 !学到了!
zhangchioulin
2015-06-04 23:43:10 +08:00
@black 谢谢,听了你的发现了 !
choury
2015-06-04 23:47:12 +08:00
@zhangchioulin lldb 用起来和gdb差不多吧,实在不行打点日志也能解决问题啊
zhangchioulin
2015-06-04 23:49:43 +08:00
@choury 谢谢提醒,下次我会用的!
zhengnanlee
2015-06-04 23:51:04 +08:00
xcode的debug功能还是不错的。也可以试试clion这个IDE。话说回来,推荐从编译器的使用开始学习。
zhangchioulin
2015-06-04 23:51:19 +08:00
@billlee 感觉你的代码完胜了我的这个。。。我对这段代码有一个疑惑:为什么size一直+1,软件却不会出错?不会有数组下标越界?
zhangchioulin
2015-06-04 23:55:10 +08:00
@zhengnanlee 好的,我一会就回去研究下的
loveuqian
2015-06-05 00:08:58 +08:00
char为什么可以放“qwe”
wy315700
2015-06-05 00:13:37 +08:00
XCODE 可以加断点调试的。
billlee
2015-06-05 00:15:27 +08:00
@zhangchioulin 当 size 增加到 3 时, s[size] 是 0, while 的条件变为假,循环结束
omph
2015-06-05 00:16:17 +08:00
```cpp
while (*s++ != '\0')
sum++;
```
alphonsez
2015-06-05 00:16:57 +08:00
如果*s == 0的话,你不就直接return 0了吗?你这个sum都没return过。
zhangchioulin
2015-06-05 00:47:29 +08:00
@loveuqian 因为这是一个字符数组
zhangchioulin
2015-06-05 00:52:24 +08:00
@loveuqian 我收回刚刚回答的,char *name = "qwe"; 是一个字符串常量
晕,被绕进去了,如果你知道的话轻at我下
loveuqian
2015-06-05 12:37:11 +08:00
@zhangchioulin
我还在纠结为什么写个交换2个数的值的函数要传入指针呢。。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/196200

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX