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

来源:互联网 发布:寝室抢网速软件 编辑:程序博客网 时间:2024/05/24 07:42

问题描述:
/* 功能:在字符串中找出连续最长的数字串,并把这个串的长度返回
函数原型:
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++;// orwhile (*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指向的字符串不可变。

0 0
原创粉丝点击