字符串的存储
C语言是面向过程的一门语言,不像JAVA,C#等面向对象的编程语言那样有String这种变量类型,在C语言中字符串的存储是通过字符数组实现的。只要保证字符串是以空字符结尾的,任何一维字符数组都可以用来存储字符串。
C库函数对字符串操作
C语言为了弥补缺少字符串操作的运算,在<string.h>中提供了对字符串操作的函数。下面对其中的一些函数尝试进行模拟实现:
char *strstr( const char *string, const char *strCharSet );
/*思路: 1.记录下每次从参数 string 中要开始找 str 的起点
2.从起点开始遍历两个字符串,一旦发现不匹配就推出,起始点移动1位
3.当起始地点位 NULL 时,说明找不到子串 str,当有一次遍历后子串
str 的指针指向它的空字符时,说明找到了,返回起始点后的字符串
*/
char* strstr(const char* string, const char* str)
{
assert(string && str);
const char* cp = string;
const char* p1 = cp;
const char* p2 = str;
while (*cp)
{
p1 = cp;
p2 = str;
while ((*p1) && (*p2) && (*p1 == *p2))
{
p1++;
p2++;
}
if (*p2 == '\0')
{
return cp;
}
else
{
cp++;
}
}
return NULL;
}
char *strcat( char *strDestination, const char *strSource );
/*思路:1.首先字符指针移动到空字符位置
2.将src字符串从空字符处逐个添加
*/
char* strcat(char *dest, const char *src)
{
char* res = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++);
return res;
}
int strcmp( const char *string1, const char *string2 );
/*思路 移动字符指针,当比较的两个字符串的字符相等
并且其中有一个为空字符(也就是两个都为空字符)时,
说明两字符串相等返回 0,当出现两个比较的字符不等时,
相减比较大小,str1>str2 时,返回 1 ,反之,返回 -1
*/
int strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1++ == *str2++)
{
if (*str1 == '\0')
{
return 0;
}
}
return (*str1 - *str2) ? 1 : -1;
}
在模拟实现后,再对照VS的安装目录下D:\Microsoft Visual Studio 12.0\VC\crt\src
函数的参考实现。发现了一些惯用的写法(trick)。
- 搜索字符串结尾
while(*s++);//最终指向空字符后面的位置
while(*s)
s++;//s最终指向空字符的位置
- 复制字符串
while(*p++ = *s++);//这样的好处是不用再单独添加空字符