C语言并没有字符串类型,而是通过把字符数组的字符后面一位赋值为’\0’字符来实现的, 这个’\0’字符的码值为0, 而不是’0’字符的48!
C语言的这种通过数组的方式进行存储字符串的形式在使用的过程有很大的难度, 一不小心就可能越界或者注意不到这个字符串和数组的长度, 所幸的是string.h头提供了一些处理字符串的库函数, 当然这些函数为了效率都是使用汇编实现的, 下面我就贴上我自己实现的C语言的库函数, 我的实现方法极大的保证了效率和代码的间接性, 如果有官方的实现估计也和我这差不多吧!
字符串复制函数strcpy:
char* strcpy(char* s1, const char* s2)
{
while ((*s1++ = *s2++))
;
return s1;
}
strncpy函数, 复制字符串的时候相对更安全的选择:
char* strncpy(char* s1, const char* s2, int len)
{
int i = 0;
while (i < len && (*s1++ = *s2++))
i++;
return s1;
}
计算字符串的实际长度strlen:
size_t strlen(const char* s)
{
const char* ptr = s;
while (*ptr++)
;
return ptr - s;
}
拼接字符串strcat:
char* strcat(char* s1, const char* s2)
{
char* ptr = s1;
while (*ptr++)
;
while ((*ptr++ = *s2++))
;
return s1;
}
拼接字符串更安全的选择strncat:
char* strncat(char* s1, const char* s2, int len)
{
char* ptr = s1;
int i = 0;
while (*ptr++)
;
while (i < len && (*ptr++ = *s2++))
;
return s1;
}
字符串比较函数strcmp:
操作指针的写法:
int strcmp(const char* s1, const char* s2)
{
for (;*s1 == *s2; s1++, s2++)
if (*s1 == '\0')
return 0;
return *s1 - *s2;
}
操作下标的写法:
int strcmp(const char* s1, const char* s2)
{
int i = 0;
for (;s1[i] == s2[i]; i++)
if (s1[i] == '\0')
return 0;
return s1[i] - s2[i];
}
我在实现这些函数的时候使用了一些C语言特有的高效和简洁的写法, 虽然读者未必需要去实现, 但是这些书写的惯用法还是必须掌握的!当然很多地方我都是使用的while而不是for循环,for循环是个强大的工具,但也切勿滥用!
注:官方的函数原型在C99中会使用restrict受限指针,此处不做详细介绍!