你必须知道的指针基础-5.指针的几个小应用案例

一、使用指针传出分解后的数字

  实现一个方法“多个返回值”的效果:返回一个三位数数字的个位、十位、百位。这里,我们借助指针来”返回“分解后的结果。这种应用也是最常见的指针应用。

// fun1:分解一个三位数,传递个位、十位和百位数字
int parseNumber(int num,int* g,int* s,int* b)
{
    if(num < 100 || num > 999)
    {
        // 只允许100~999的数字
        return -1;
    }

    *g = num % 10;
    *s = (num / 10)%10;
    *b = (num/100)%10;

    return 1;
}

  测试数字为365,调用parseNumber函数,将要返回的值的地址作为参数传递:

int main(int argc, char *argv[])
{
    int num = 365;
    int g,s,b;
    if(parseNumber(num,&g,&s,&b))
    {
        printf("%d %d %d\n",b,s,g);
    }
    return 0;            
}

  运行结果如下图所示:

二、自己动手实现strlen()函数

  我们知道strlen是计算字符串的长度,其内部是通过判断是否以'\0'作为结束符,虽然其不是一个安全的方式,但是却是各大C教材中最常见的函数。这里,我们来自己实现一个strlen函数,利用指针的移动来辅助计算长度,这也是指针的一个最常见的应用。

// fun2:自己模拟实现strlen函数
int myStrlen(char* str)
{
    int len = 0;
    while(*str != '\0')
    {
        str++;
        len++;
    }

    return len;
}

  测试字符串为”hello“,长度为5,Main函数声明如下:

int main(int argc, char *argv[])
{
    char test[] = "hello";
    int len = myStrlen(test);
    printf("The length of 'hello' is %d\n",len);
    return 0;
}

  运行结果如下图所示:

三、判断字符串A是否以字符串B结尾

  判断一个字符串是否以另一个子子字符串结尾,这个方法在Java中属于String类,叫做endsWith。在C#中,也位于String类,叫做EndsWith,并提供了三个重载。这里,我们借助指针来辅助实现这个经典的endsWith方法。

// fun3:判断字符串A是否以字符串B结尾
int endsWith(char* str,char* substr)
{
    int strlen = 0;
    while(*str != '\0')
    {
        str++;
        strlen++;
    }

    int sublen = 0;
    while(*substr != '\0')
    {
        substr++;
        sublen++;
    }

    if(strlen < sublen)
    {
        // 如果子串长度比主串还长
        return -1;
    }

    int i;
    for(i=0;i<=sublen;i++)
    {
        // 从末尾开始对比每一个字符
        char strCh = *str;
        char subCh = *substr;
        if(strCh != subCh)
        {
            return 0;
        }
        else
        {
            str--;
            substr--;
        }
    }

    return 1;
}

  该方法主要经历两个步骤,一是分别计算主串和子串的长度,如果子串长度超过主串长度,那么直接返回0,代表主串不以子串结尾;二是分别从末尾对主串和子串的每一个字符进行比对,直到循环结束(判断条件是子串的长度),如果其中有一个不同,那么直接返回0。

  下面对这个endsWith函数进行一个简单的测试,分别给出一个合适的用例和不合适的用例:、

int main(int argc, char *argv[])
{
    char str[] = "edisonchou";
    char sub[] = "chou";
    printf("%d\n", endsWith(str,sub));
    char sub2[] = "zhou";
    printf("%d\n", endsWith(str,sub2));
    
    return 0;
}

  运行结果如下图所示:

参考资料

  如鹏网,《C语言也能干大事(第三版)》

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏鸿的学习笔记

简单定义Python和Scala的类和对象

在现代编程语言里,类和对象都是绕不过的话题。对象这个概念可以是生活的抽象,为了更好的理解使用书来做比喻,每一本书都是一个对象,也就是一个实例,书本身具有的页码等...

8710
来自专栏HansBug's Lab

1798: [Ahoi2009]Seq 维护序列seq

1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Submit: 2930...

31150
来自专栏互联网杂技

聊聊ES7与ES8特性

ES7只有2个特性: includes() 指数操作符 ES8尚未发布(2017年1月),下面是它已经完成起草的一些特性: Object.values() O...

34990
来自专栏Coding迪斯尼

使用普拉特分析法解析极为复杂的算术表达式

12430
来自专栏Netkiller

GSON 多层Map剥离

工作中遇到一个问题,我们提供给外包方的 json 无法Decode 。 一段简单 JSON 字符串,字符串如下。 String json= "{\"0\":{...

31940
来自专栏算法修养

CodeForces 666A Reberland Linguistics(DP)

A. Reberland Linguistics time limit per test 1 second memory limit per test ...

41150
来自专栏数据结构与算法

BZOJ4198: [Noi2015]荷马史诗(哈夫曼树)

Allison 最近迷上了文学。她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的《荷马史诗》。但是由《奥德赛》和《伊利亚特》组成的鸿篇巨制...

7310
来自专栏前端架构与工程

【译】《Understanding ECMAScript6》- 第一章-基础知识(一)

目录: 更好的Unicode编码支持 codePointAt()函数 String.fromCodePoint() 用转义序列对Non-BMP字符编码 nor...

27650
来自专栏函数式编程语言及工具

Scalaz(18)- Monad: ReaderWriterState-可以是一种简单的编程语言

  说道FP,我们马上会联想到Monad。我们说过Monad的代表函数flatMap可以把两个运算F[A],F[B]连续起来,这样就可以从程序的意义上形成一种串...

20570
来自专栏算法修养

PAT 甲级 1060 Are They Equal

1060. Are They Equal (25) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B ...

32250

扫码关注云+社区

领取腾讯云代金券