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)
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;
//代码效果参考:http://www.zidongmutanji.com/zsjx/40201.html
size_t len;
if (word == NULL)
return -1;
if (word == '\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';
/ 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);