V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zhangchioulin
V2EX  ›  问与答

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

  •  
  •   zhangchioulin · 2015-06-04 23:22:08 +08:00 · 1980 次点击
    这是一个创建于 3490 天前的主题,其中的信息可能已经有所发展或是发生改变。

    事情是这样的

    我再自学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一下直接跳出文本编辑框
    //我想总不能一个一个按空格吧,大家怎么解决的?

    20 条回复    2015-06-05 12:37:11 +08:00
    billlee
        1
    billlee  
       2015-06-04 23:34:40 +08:00   ❤️ 1
    // 你每次碰到 '\0' 就直接返回 0, 当然所有输入都返回 0 啦

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

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

    学语言的同时也要学习如何debug你的程序
    zhangchioulin
        4
    zhangchioulin  
    OP
       2015-06-04 23:41:04 +08:00
    @black 哎呀!真的!
    zhangchioulin
        5
    zhangchioulin  
    OP
       2015-06-04 23:41:52 +08:00
    @choury 用IDE的话会DEBUG但是我是用XCODE加终端的。这个实在不知道怎么DEBUG
    zhangchioulin
        6
    zhangchioulin  
    OP
       2015-06-04 23:42:51 +08:00
    @billlee 谢谢 !学到了!
    zhangchioulin
        7
    zhangchioulin  
    OP
       2015-06-04 23:43:10 +08:00
    @black 谢谢,听了你的发现了 !
    choury
        8
    choury  
       2015-06-04 23:47:12 +08:00
    @zhangchioulin lldb 用起来和gdb差不多吧,实在不行打点日志也能解决问题啊
    zhangchioulin
        9
    zhangchioulin  
    OP
       2015-06-04 23:49:43 +08:00
    @choury 谢谢提醒,下次我会用的!
    zhengnanlee
        10
    zhengnanlee  
       2015-06-04 23:51:04 +08:00 via Android
    xcode的debug功能还是不错的。也可以试试clion这个IDE。话说回来,推荐从编译器的使用开始学习。
    zhangchioulin
        11
    zhangchioulin  
    OP
       2015-06-04 23:51:19 +08:00
    @billlee 感觉你的代码完胜了我的这个。。。我对这段代码有一个疑惑:为什么size一直+1,软件却不会出错?不会有数组下标越界?
    zhangchioulin
        12
    zhangchioulin  
    OP
       2015-06-04 23:55:10 +08:00
    @zhengnanlee 好的,我一会就回去研究下的
    loveuqian
        13
    loveuqian  
       2015-06-05 00:08:58 +08:00
    char为什么可以放“qwe”
    wy315700
        14
    wy315700  
       2015-06-05 00:13:37 +08:00
    XCODE 可以加断点调试的。
    billlee
        15
    billlee  
       2015-06-05 00:15:27 +08:00
    @zhangchioulin 当 size 增加到 3 时, s[size] 是 0, while 的条件变为假,循环结束
    omph
        16
    omph  
       2015-06-05 00:16:17 +08:00
    ```cpp
    while (*s++ != '\0')
    sum++;
    ```
    alphonsez
        17
    alphonsez  
       2015-06-05 00:16:57 +08:00
    如果*s == 0的话,你不就直接return 0了吗?你这个sum都没return过。
    zhangchioulin
        18
    zhangchioulin  
    OP
       2015-06-05 00:47:29 +08:00
    @loveuqian 因为这是一个字符数组
    zhangchioulin
        19
    zhangchioulin  
    OP
       2015-06-05 00:52:24 +08:00
    @loveuqian 我收回刚刚回答的,char *name = "qwe"; 是一个字符串常量
    晕,被绕进去了,如果你知道的话轻at我下
    loveuqian
        20
    loveuqian  
       2015-06-05 12:37:11 +08:00
    @zhangchioulin
    我还在纠结为什么写个交换2个数的值的函数要传入指针呢。。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1304 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:37 · PVG 01:37 · LAX 09:37 · JFK 12:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.