HuaweiCode-在字符串中找出连续最长的数字串

问题描述:
/* 功能:在字符串中找出连续最长的数字串,并把这个串的长度返回
函数原型:
unsigned int Continumax(char** pOutputstr, char* intputstr)
输入参数:
char* intputstr 输入字符串

输出参数:
char** pOutputstr: 连续最长的数字串,如果连续最长的数字串的长度为0,应该返回空字符串
pOutputstr 指向的内存应该在函数内用malloc函数申请,由调用处负责释放**

返回值:
连续最长的数字串的长度
*/

#include<malloc.h>
#include<string.h>
#include "oj.h"

unsigned int Continumax(char ** pOutputstr,  char* intputstr) // 008 华为code 统计最长数字串
{
    int count=0, max = 0;
    char *p=NULL, *temp=NULL, *copy_p=NULL;

    *pOutputstr = (char *) malloc(strlen(intputstr)+1);
    copy_p = *pOutputstr;
    *copy_p = '\0';
    p = intputstr;
    if (p == NULL) {return 0;}  // 如果指针为空,返回0

    // 遍历输入字符串,找出最长的字符串。并用int max 和 char *temp分别记录该串的长度和最后一个数字的位置                   
    while (*p)      
    {
        if(*p >= '0' && *p <= '9') 
        {
            if( ++count >= max)
            {max = count;temp = p;}
        }
        else count = 0;
        p++;
    }

    if(max)     // 判断字符串长度,长度为零返回空字符,否则返回数字串长度(max 或 0)
    {   p = temp -max+1;
        while(p <= temp)
            *copy_p++ = *p++;
        *copy_p = '\0';
        return max;
    }
    else 
        return 0;
}
从昨天开始编写,到今天调通,确实绕了一些弯路,不过太调试的过程中弄清楚了几点容易忽略的知识点,记录下来,以供与大家一起交流讨论和以后的复习回顾,另一点是在基本通过所有自己能想到的测试用例后,对代码进行了一些优化(目前仅限于指减少代码行,时间、空间复杂度有待以后考虑(嘿嘿))。
1. 一开始没有注意到黑体部分的题目要求(pOutputstr 指向的内存应该在...),提交数次均未通过。最后回头阅读题目的时候才发现原因。
2. 对于char ** pOutputstr 即指针的指针的操作,一开始编码时只是把它当成了指针,对其操作当然不起作用,main()函数里的pOutputs指针(char *pOutputstr=NULL)指向的空间仍然为空。然后在演草纸上仔细写写画画内存、指针、指针的指针的关系后才梳理清楚。这也得益于看了《C语言程序设计现代方法》里面介绍指针的内容,好书也值得推荐(看了谭老师的指针部分有些迷糊,就转看这本了)。
3. 一开始用指针实现判断字符的区间(是否在0~9)和字符赋值操作的时,代码比较冗长。然后就把从书上看到的惯用法运用到了代码,简洁许多(肯定有更简单的,但相对于我之前的版本简洁多了,是不是暴漏了我现在的水平!!!)。字符串惯用法:
//【惯用法1#define STR_LEN 80
...
char str[STR_LEN+1];
// 即,别忘记也为空字符'\0'开辟一个字节的空间

//【惯用法2while (*s)
    s++;
// or
while (*s++)
    ;
//【惯用法3while (*p++ == *s++)
    ;

惯用法2和3能看出大概作用吗,如果可以,那恭喜你。如果不能,也不比着急,我改天再来补充。

万恶的拖延症,时隔这么久才补充。2015.05.21
惯用法2和3的作用是, 搜索字符串的结尾,其提炼于以下求字符串长度的程序 strlen(char *s)

Edition 1:
size_t strlenconst char *s)
{
    size_t n;
    for (n = 0; *s != '\0'; s++)
        n++;
    return n;
}

Edition 2 :
size_t strlen(const char *s)
{
    size_t n = 0;
    for(; *s++; )
        n++;
    return n;   
}

Edition 3 :
size_t strlen(const char *s)
{
    const char *p = s;
    while( *s )
        s++;
    return s - p;   
}

Ps : const char *s 并不是限定指针s不可变,而是限定指针s指向的字符串不可变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值