1. 苏葳的备忘录首页
  2. 编程

C的求子串及定位串函数,纠结。

c语言 指针 子串用C#和java之类现代语言久了,字符串操作简直是随心所欲。昨天需在C下写一报文串处理,才发现C中的字符串操作是如此匮乏。只得自己写了二函数,测试结果正常,在实际应用中却错误百出,重温了以前VC编程时的恶梦。指针混乱和内存越界,地址重叠等毫无疑问是最大的问题,strcat函数嵌套多次后也有怪异的表现。自写函数如下:

/* 求子串1 */
char*   substr1( char*   src,   int   offset,   int   count)
{
 char* des="";
 char*   temp=des;
 int srclen=0;
 int   i;
 srclen=strlen(src);
 src   +=   offset;
 if (offset>srclen)
  return "";
 for(i   =   0;   (i   <   count)&&(i+offset<srclen);   i++)
 {
  *des++   =   *src++;
 }
 *des   =   '\0';
 return   temp;
}

上面函数导致严重问题,应该是指针越界导致。

/* 求子串2 .*/
char*   substr( char*   src,   int   offset,   int   count)
{
 char  des[count+1];
 char*   temp=des;
 int srclen=0;
 int   i;
 srclen=strlen(src);
 src   +=   offset;
 if (offset>srclen)
  return "";
 for(i   =   0;   (i   <   count)&&(i+offset<srclen);   i++)
 {
  *temp++   =   *src++;
 }
 *temp   =   '\0';
 return   des;
}

函数2改进后如下,先定义内部数组分配足够空间,再拷贝子串数据进入此数组,最后返回数组地址。使用目前正常。

/*  求匹配串索引 .*/
int strindex(char* src,char* des)
{
 char* ptr=strstr(src,des);
 if (strlen(ptr)==0)
  return -1;
 else
  return ptr-src;
}

此函数不涉及指针及地址修改,应无问题。

目前软件项目有如下特点:

工期比项目功能更重要,项目功能比项目质量更重要。选择一种开发思路,要避免一些危险的方式。优先选择也许是最笨但最可靠的方法,提高可读性,减少程序陷阱,避免在项目规模扩张后导致无法解决的问题。如C的内存操作,尽量显式分配空间,尽量拷贝而不是指针赋值,虽然牺牲些效率和空间,但带来的好处会远大于损失。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/306.html

发表评论

邮箱地址不会被公开。 必填项已用*标注