一、字符串长度函数
字符串长度即就是一个字符串中所包含的的字符个数。所以可以通过对字符串中的字符进行统计即可。
实现:由于不需要对字符串进行修改,为了保护源字符串,故将其参数设计成const类型,返回值为有符号整形。
</pre><pre name="code" class="cpp">int my_strlen1(const char *str)
{
assert(str);
int count = 0;
while (*str)
{
str++;
count++;
}
return count;
}
还有一种思路可以利用指针相减从而确定出该字符串中的字符个数。
实现:参数和上例相同。
int my_strlen2(const char *str)
{
assert(str);
const char* p = str;
while (*str++);
return (str - p -1);
}
二、字符串复制函数
将参数src字符串复制到参数dest。其实现如下:
char *my_strcpy(char *dest, const char * src)
{
assert(dest);
assert(src);
char *p = dest;
while (*dest++ = *src++);
return p;
}
注意:在使用该函数时必须保证dest所指向的字符数组的大小足以放下src所指向的字符串的大小。如果src所指向的字符串较长则有可能出现内存访问出错,程序崩溃。因为strcpy函数无法判断dest字符数组的长度。
三、连接字符串函数
该函数可以将一个字符串连接到另一个字符串后面。实现如下:
char *my_strcat(char *dest, const char *src)
{
assert(dest);
assert(src);
char *p = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++);
return p;
}
注意:该函数要求dest锁指向的字符数组原先必须有字符串,并且其大小必须可以放下src所指向的字符串。
四、字符串比较函数
比较两个字符串是对两个字符串对应的字符逐个进行比较,知道发现不匹配为止。那个最先不匹配的字符中较小的字符所在的字符串小于另外一个字符串。如果两个字符串前面的字符均相等则那个最先出现‘\0’那个小于另外一个。
实现如下:
int my_strcmp(const char * str1 ,const char * str2)
{
assert(str1);
assert(str2);
int ret = 0;
while ( *str1 == *str2)
{
if (*str1 == '\0')
ret = 0;
str1++;
str2++;
}
ret = *str1 - *str2;
if (ret > 0)
ret = 1;
else if (ret < 0)
ret = -1;
return ret;
}
注意:在使用该函数的时候不能直接将该函数的返回值作为if/while的判断条件。因为标准并没有规定str1>str2是返回1,str1<str1返回-1,;在不同的操作系统和不同的编译器里其返回值的大小是不统一的。所以在使用时应该先判断其返回值的正负之后再进行if/while的判断。
五、查找子串
该函数在src所指向的字符串中查找dest所指向的字符串第一次出现的位置,并返回一个指向该位置的指针。如果dest没有完整的出现在src中则返回NULL。
实现如下:
const char * my_strstr( const char * src,const char * dest)
{
assert(src);
assert(dest);
while (*src)
{
const char *ret = src;
while ( (*dest == *src) && *src )
{
dest++;
src++;
if (*dest == '\0')
return ret;
}
src++;
}
return NULL;
}
总结:1、使用strcpy时,将一个长的字符串复制到短的字符串中,导致溢出,程序崩溃。
2、使用strcat 时,dest字符数组长度不够,导致溢出。
3、使用strcmp时,将其返回值作为bool值进行测试。