问题描述:
/* 功能:在字符串中找出连续最长的数字串,并把这个串的长度返回
函数原型:
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'开辟一个字节的空间
//【惯用法2】
while (*s)
s++;
// or
while (*s++)
;
//【惯用法3】
while (*p++ == *s++)
;
惯用法2和3能看出大概作用吗,如果可以,那恭喜你。如果不能,也不比着急,我改天再来补充。
万恶的拖延症,时隔这么久才补充。2015.05.21
惯用法2和3的作用是, 搜索字符串的结尾,其提炼于以下求字符串长度的程序 strlen(char *s)
Edition 1:
size_t strlen(const 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指向的字符串不可变。