C语言的一些常用代码

        C语言经常需要发明各种轮子,为方便以后能够把精力放在应用逻辑上而不在发明轮子上,把一些常用的代码片段列于此。

        首先是字符串处理方面的,strcpy 函数容易越界,习惯使用 strncpy 函数,但此函数只管复制最多 n 个字符,并不会把末尾的字符自动修改为 '\0',所以给它加上这个操作:

char* utils_strncpy (char *dest, const char *src, size_t length)
{
      strncpy (dest, src, length);
      dest[length] = '\0';
      return dest;
}
内存分配函数 malloc 分配内存却不进行初始化,给它也加上初始化的操作:
void* utils_malloc (size_t size)
{
      void *ptr = malloc (size);

      if (ptr != NULL)
            memset (ptr, 0, size);
      return ptr;
}
内存释放函数 free 只是释放内存,却不把指针置为空指针,而且对空指针执行 free 也不知道是否安全,于是改造如下:
void utils_free(void **p)
{
      if (p == NULL || *p == NULL)
            return;

      free(*p);
      *p = NULL;
}

相应的有字符串复制函数:

char* utils_strdup (const char *ch)
{
      char *copy;
      size_t length;

      if (ch == NULL)
            return NULL;
      length = strlen (ch);
      copy = (char *) utils_malloc (length + 1);
      if (copy==NULL)
	    return NULL;
      utils_strncpy (copy, ch, length);
      return copy;
}

把字符串中的大写字母改为小写:

int utils_tolower (char *word)
{
      size_t i;
      size_t len = strlen (word);

      for (i = 0; i <= len - 1; i++)
      {
            if ('A' <= word[i] && word[i] <= 'Z')
            word[i] = word[i] + 32;
      }

      return 0;
}
清除字符串首尾的空白字符(空格,\r,\n,\r):
int utils_clrspace (char *word)
{
      char *pbeg;
      char *pend;
      size_t len;

      if (word == NULL)
            return -1;
      if (*word == '\0')
            return 0;
      len = strlen (word);

      pbeg = word;
      while ((' ' == *pbeg) || ('\r' == *pbeg) || ('\n' == *pbeg) || ('\t' == *pbeg))
            pbeg++;

      pend = word + len - 1;
      while ((' ' == *pend) || ('\r' == *pend) || ('\n' == *pend) || ('\t' == *pend))
      {
            pend--;
            if (pend < pbeg)
            {
                 *word = '\0';
                 return 0;
            }
      }

      /* Add terminating NULL only if we've cleared room for it */
      if (pend + 1 <= word + (len - 1))
            pend[1] = '\0';

      if (pbeg != word)
      memmove (word, pbeg, pend - pbeg + 2);

      return 0;
}

嘎然而止.......

转载于:https://my.oschina.net/zhcosin/blog/102281

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值