一.字符串函数函数
1.strlen函数
2.strcpy函数
3.strcat函数
4.strcmp函数
5.strncpy函数
6.strncat函数
7.strncmp函数
8.strstr函数
9.strtok函数
10.strerror函数
二.内存函数
1.memcpy函数
2.memmove函数
3.memcpy函数
4.memset函数
一.字符串函数函数
1.strlen函数
size_t strlen ( const char * str )
计算字符串长度,返回字符串mubiaostrlen()函数以\0作为结束标志,返回的是\0之前的字符个数
- 参数指向的字符串必须以\0结束
- 参数的返回值是一个无符号整数
- strlen()函数模拟
-
#include<assert.h> size_t strlen(const char* p) { assert(p != NULL); int const = 0; while (*p) { const++; p++; } return const; } int main() { char arr[] = "abcdef"; printf("&d", strlen(arr)); return 0; }
2.strcpy函数
-
char* strcpy(char * destination, const char * source )
将源字符串拷贝到目标字符串中,返回的是目标字符串的地址
目标空间要足够大
char* my_strcpy(char* dest, const char* src)
{
assert(dest&&src);
char* ret = dest;
while (*dest++=*src++)
{
;
}
return ret;
}
3.strcat函数
char * strcat ( char * destination, const char * source )
将源字符串拼接到目标字符串的后面,返回的是目标字符串的地址
目标空间要足够大
strcat的模拟实现
char* my_strcat(char* dest, const char* src)
{
assert(dest&&src);
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++=*src++)
{
;
}
return ret;
}
4.strcmp函数
int strcmp ( const char * str1, const char * str2 );
- 第一个数大于第二个数返回>0的数
- 第一个数小于第二个数返回<0的数
- 第一个数等于第二个数返回==0的数
- 模拟strcmp函数
int my_strcmp(const char* s1, const char* s2)
{
assert(s1&&s2);
while (*s1 == *s2)
{
if (*s1 == '\0')
{
return 0;
}
s1++;
s2++;
}
if (*s1>*s2)
{
return 1;
}
else
{
return -1;
}
}
上面四种都是字符串长度不受限制的,下面三种字符串长度受限制的!!!
5.strncpy函数
char * strncpy ( char * destination, const char * source, size_t num )
比strcpy多了num参数
会指定复制长度n个
6.strncat函数
char * strncpy ( char * destination, const char * source, size_t num )
比strcat多了一个长度限制参数
7.strncmp函数
int strncmp ( const char * str1, const char * str2, size_t num )
比strcmp函数多了一个参数num的长度限制
只会比较num个字符
8.strstr函数
在一个字符串中查找指定字符串是否存在,存在返回第一次出现的位置到结束的字符串
模拟strstr函数
const char* strstr(const char* a, const char* b)
{
assert(a && b);
const char* s1 = NULL;
const char* s2 = NULL;
const char* c = a;
while (*c)
{
s1 = c;
s2 = b;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return c;
c++;
}
return NULL;
}
//i
9.strtok函数
char * strtok ( char * str, const char * sep )
- const char* sep这个参数是一个字符串,定义了分隔符的集合
- 第一个参数是一个字符串,该字符串里面可以包含0个或多个分隔符字符
- strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。
- 如果第一个参数不为NULL,那么该函数会找到该字符串中第一次出现该分隔符的位置,进行分割,并且记录下一次出现分隔符的位置
- 如果第一个参数为NULL,那么该函数会从下一次被标记的位置开始,进行分割
- 如果字符串中不存在更多的标记那么返回NULL
strtok函数的使用
#include<string.h>
int main()
{
char arr[1000] = "sjascnw@csxajn.chsabc";//当p到@位置时@被分割成为\0,为空指针,调用时用NULL
char arr1[121] = { 0 };
strcpy(arr1, arr);
char* p = "@.";
//char*ret=strtok(arr, p);
//strtok(NULL, p);
//printf("%s\n", ret);
//ret = strtok(NULL, p);
//printf("%s\n", ret);
//ret = strtok(NULL, p);
//printf("%s\n", ret);
char* ret = NULL;
for (ret= strtok(arr1, p); ret != NULL;ret=strtok(NULL,p))
{
printf("%s\0", ret);
}
return 0;
}
10.strerror函数
char * strerror ( int errnum )
- 库函数在执行的时候,发生了错误会将一个错误码存放在errno这个变量中errno是C语言提供的一个全局的变量
- 参数为错误码,只要给一个错误码,就会返回当前错误码对应的错误信息
strerror的使用
#include<errno.h>
#include<string.h>
int main(){
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
printf("不存在:&s\n",strerror(errno));
}
else
{
printf("打开文件成功");
fclose(pf);
pf = NULL;
}
}
二.内存函数
1.memcpy函数
void * memcpy ( void * destination, const void * source, size_t num )
拷贝内存中的数据
如果source和destination有任何的重叠,复制的结果都是未定义的,即不能复制重叠部分的内容
memcpy函数模拟实现
void* memcpy(void* p1, void* p2, size_t num)
{
assert(p1 && p2);
void* ret = p1;
for (int i = 0; i < num; i++)
{
*(char*)p1 = *(char*)p2;
p1 = (char*)p1 + 1;
p2 = (char*)p2 + 1;
}
return ret;
}
2.memmove函数
void * memmove ( void * destination, const void * source, size_t num )
和memcpy作用类似,但它可以拷贝重叠部分的内容,也可以拷贝不重叠部分的内容!
模拟实现memmove函数
void* memmove(void* dest, void const* src,size_t num)
{
assert(dest && src);
char* ret = dest;
if (dest < src)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
3.memcpy函数
int memcmp ( const void * ptr1, const void * ptr2, size_t num )
两个数据进行比较,以内存字节为基准
例如
int main()
{
int arr[] = { 1,2,3,4,5,6 };
int arr2[] = { 1,2,3,7,5,6 };
printf("%d", memcmp(arr, arr2, 16));
return 0;
}
为memcpy函数的使用
按照一个一个字节比较,如果这些字节都相等就返回0.如果第一个字节大返回>0的数,如果第一个字节小返回<0的数
4.memset函数
void * memset ( void * ptr, int value, size_t num )
将ptr所指向的内存空间,按字节填充为value
#include<string.h>
int main()
{
char arr[] = "abdddd ksksls";
printf("%s", memset(arr + 7, 'x', 6));
return 0;
}