目录
在c语言中有许多方便操作字符串和内存的函数,接下来我们介绍几个比较重点的函数。
一 字符串函数
1.strcpy函数
其形式是
char * strcpy ( char * destination, const char * source )
指把源字符串的内容全部拷贝到目标字符串中去。destination是目标字符串首元素的地址;source是源字符串首元素的地址。其在使用过程中有一些要点如下:
1.源字符串必须以'\0'结束
2.会将源字符串中的’\0‘拷贝到目标空间
3.目标空间必须足够大,以确保可存下源字符串
4.常量字符串无法修改,因此不能将常量字符串作为目标字符串
5.返回值是char*,是目标数组的首元素地址。
strcpy的模拟实现如下:
char* my_strcpy(char* str1, char* str2)
{
char* destion = str1;
while (*str1++ = *str2++)
{
;
}
return destion;
}
2.strcat函数
其使用形式是
char * strcat ( char * destination, const char * source )
指在目标字符串后追加源字符串。使用过程中的一些要点如下:
1.源字符串是从目标字符串的'\0'开始追加,也就是说目标字符串的'\0'会被覆盖掉。
2.源字符串的'\0'也会被拷贝过去
3.目标空间必须足够大
4.目标空间必须可修改
下面是模拟实现:
char* my_strcat(char* str1, char* str2)
{
char* ret = str1;
while (*str1 != '\0')
{
str1++;
}
while (*str1++ = *str2++)
{
;
}
return ret;
}
3.strcmp函数
其形式是
int strcmp ( const char * str1, const char * str2 )
进行两个字符串的比较,比较的是对应位置上字符ASCIl码大小,如果第一个字符串小于第二个返回-1;第一个字符串大于第二个返回1;两个相等返回0.
模拟实现如下:
int my_strcmp(char* str1, char* str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
if (*str1 - *str2 > 0)
{
return 1;
}
else
{
return -1;
}
}
4.strstr函数
其形式如下
const char * strstr ( const char * str1, const char * str2 )
作用是在一个字符串中找另外一个字符串是否存在
存在:返回子串第一次出现的位置(地址)
不存在:返回空指针
模拟实现思路如下:
具体代码如下:
char* my_strstr(char* str1, char* str2)
{
const char* p = str1;
const char* s2 = str2;
const char*s1 = p;
if (*str2 == '\0')
{
return str1;
}
while (1)
{
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return p;
}
else if(*s1=='\0')
{
return NULL;
}
p++;
s1 = p;
s2 = str2;
}
}
5.strtok函数
具体形式如下
char * strtok ( char * str, const char * delimiters )
strtok函数是字符串切割函数,每使用一次它会将字符串中的第一个特殊字符变为'\0',除第一次使用第一个参数要传被切割字符串首元素的地址之外,其余的使用第一个参数都传NULL。
str是指所要切割字符串的首元素的地址,delimiters指被切割字符串中所有特殊字符的地址
具体使用实例如下:
打印结果如下:
二 内存函数
1.memcpy
具体形式如下
void * memcpy ( void * destination, const void * source, size_t num )
作用是将源内存中num个字节的内容,拷贝到目标内存中。可以拷贝不同类型的数据,但是源空间和目标空间所能存放的数据类型必须相同。
模拟实现如下:
void* my_memcpy(void* str1, void* str2, int num)
{
void* ret = str1;
while (num--)
{
*(char*)str1 = *(char*)str2;
str1 = (char*)str1 + 1;
str2 = (char*)str2 + 1;
}
return ret;
}
2.memmove
具体形式如下
void * memmove ( void * destination, const void * source, size_t num )
作用是实现重叠内存的拷贝,也就是自己拷贝自己num个字节的内容。
模拟实现的要点:
1.dest<src
从前往后拷贝
2.dest>src
从后往前拷贝
3.因其接受参数类型是void*,因此要将其强制类型转换成char*来进行计算。
具体代码如下:
void* my_memmove(void* dest, void* str, int num)
{
assert(dest);
assert(str);
char* ret = dest;
if (dest < str)
{
while (num--)
{
*(char*) dest= *(char*)str;
dest = (char*)dest + 1;
str = (char*)str + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)str + num);
}
}
return ret;
}
3.memcmp
其具体形式如下
int memcmp ( const void * ptr1, const void * ptr2, size_t num )
作用是对ptr1与ptr2所指向的两块内存进行一个字节一个字节的比较,大于0返回1;小于0返回-1;相等返回0.
4.memset
其具体形式如下
void * memset ( void * ptr, int value, size_t num )
作用是将ptr所指向内存块的num个字节的数据全部改为value。