- 1.strlen
size_t strlen ( const char * str );
注意事项:
字符串已经
'\0'
作为结束标志,
strlen
函数返回的是在字符串中
'\0'
前面出现的字符个数(不包
含
'\0'
)
。
参数指向的字符串必须要以
'\0' 结束。
注意函数的返回值为
size_t
,是无符号的(
易错
)。
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <assert.h>
size_t mystrlen(const char* t)
{
int count=0;
assert(t);
while (*t)
{
count++;
t++;
}
return count;
}
int main()
{
char a[10] = { "ADFG" };
printf("%d", mystrlen(a));
return 0;
}
- 2 strcpy
char*
strcpy
(
char *
destination
,
const
char *
source
);
注意事项:
源字符串必须以
'\0'
结束。
会将源字符串中的
'\0'
拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <assert.h>
char* mystrcpy( char* a, const char* b)
{
char* ret = a;
assert(a);
assert(b);
while (*a++=*b++)
{
;
}
*a='\0';
return ret;
}
int main()
{
char a[10] = { "ADFG" };
char b[10] = { "dsvgbbgf" };
mystrcpy(a,b);
printf("%s", a);
return 0;
}
- 3 strcat
char *
strcat
(
char *
destination
,
const
char *
source
);
源字符串必须以
'\0'
结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <assert.h>
char* mystrcat( char* a,const char* b)
{
char* ret = a;
assert(a);
assert(b);
while (*a)
{
a++;
]
while (*a++ = *b++)
{
;
}
return ret;
}
int main()
{
char a[20] = { "ADFG" };
char b[10] = { "dsvgbbgf" };
mystrcat(a,b);
printf("%s", a);
return 0;
}
- 4 strcmp
int
strcmp
(
const
char *
str1
,
const
char *
str2
); 、
第一个字符串大于第二个字符串,则返回大于
0
的数字
第一个字符串等于第二个字符串,则返回
0
第一个字符串小于第二个字符串,则返回小于
0
的数字
#include<stdio.h>
#include<assert.h>
int mystrcmp(const char* a,const char* b)
{
assert(a && b);
while (*a == *b )
{
if (*a == '\0')
return 0;
a++;
b++;
}
return (*a - *b);
}
int main()
{
char arr1[10] = "SADF";
char arr2[10] = "SADF";
mystrcmp(arr1, arr2);
if (mystrcmp(arr1, arr2) == 0)
{
printf("=");
}
if (mystrcmp(arr1, arr2) < 0)
{
printf("<");
}
if (mystrcmp(arr1, arr2) > 0)
{
printf(">");
}
return 0;
}
- 5 strncpy
char *
strncpy
(
char *
destination
,
const
char *
source
,
size_t
num
);
拷贝
num
个字符从源字符串到目标空间。
如果源字符串的长度小于
num
,则拷贝完源字符串之后,在目标的后边追加
0
,直到
num
个。
- 6 strncat
char *
strncat
(
char *
destination
,
const
char *
source
,
size_t
num
);
将num个字符追加到上一个字符串后面。
如果字符数量小于num,这只1在末尾加一个斜杠零。
- 7 strncmp
int
strncmp
(
const
char *
str1
,
const
char *
str2
,
size_t
num
);
比较到出现另个字符不一样或者一个字符串结束或者
num
个字符全部比较完。
- 8 strstr
char *
strstr
(
const
char *
str1
,
const
char *
str2
);
返回一个字符串中出现子串第一个字符的地址
#include<stdio.h>
#include<assert.h>
char* mystrstr(void* a, void* b)
{
assert(a && b);
(char*)a;
(char*)b;
char* p = a;
char* m = b;
while (1)
{
a = p;
b = m;
while (*(char*)a == *(char*)b&&*(char*)a!='\0')
{
(char*)a= (char*)a+1;
(char*)b= (char*)b + 1;
}
if (*(char*)b == '\0')
return p;
if (*(char*)a == '\0')
return NULL;
p++;
}
}
int main()
{
char arr1[10] = "12345";
char arr2[10] = "234";
mystrstr(arr1,arr2);
if (mystrstr(arr1, arr2) != NULL)
printf("%s", mystrstr(arr1, arr2));
if (mystrstr(arr1, arr2) == NULL)
printf("NULL");
return 0;
}
- 9 strtok
char *
strtok
(
char *
str
,
const
char *
sep
);
sep
参数是个字符串,定义了用作分隔符的字符集合
第一个参数指定一个字符串,它包含了
0
个或者多个由
sep
字符串中一个或者多个分隔符分割的标
记。
strtok
函数找到
str
中的下一个标记,并将其用
\0
结尾,返回一个指向这个标记的指针。(注:
strtok
函数会改变被操作的字符串,所以在使用
strtok
函数切分的字符串一般都是临时拷贝的内容
并且可修改。)
strtok
函数的第一个参数不为
NULL
,函数将找到
str
中第一个标记,
strtok
函数将保存它在字符串
中的位置。
strtok
函数的第一个参数为
NULL
,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。
如果字符串中不存在更多的标记,则返回
NULL
指针。
- 10 strerror
char *
strerror
(
int
errnum
);
返回错误码,所对应的错误信息
- 11 memcpy
void * memcpy ( void * destination, const void * source, size_t num );
函数
memcpy
从
source
的位置开始向后复制
num
个字节的数据到
destination
的内存位置。
这个函数在遇到
'\0'
的时候并不会停下来。
如果
source
和
destination
有任何的重叠,复制的结果都是未定义的。
#include <string.h>
#include <assert.h>
void* my_memcpy(void* dest, void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)src;
(char*)src = (char*)src + 1;
(char*)dest = (char*)dest + 1;
}
*(char*)dest = '\0';
return ret;
}
int main()
{
char arr1[10] = "ASCVG";
char arr2[10] ;
my_memcpy(arr2, arr1,5);
printf("%s ", arr2);
return 0;
}
- 12 memmove
void * memmove ( void * destination, const void * source, size_t num );
和
memcpy
的差别就是
memmove
函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用
memmove
函数处理。
#include<stdio.h>
#include<assert.h>
void mymemmove(void* a,const void* b,size_t num)
{
assert(a && b);
while (num--)
{
*((char*)a + num + 1) = *((char*)b + num + 1);
}
*((char*)a + num + 1) = *((char*)b + num + 1);
return 0;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,90,10 };
mymemmove(arr + 2, arr, 20);
printf("%d", *(arr + 3))
;
return 0;
}
- 13 memcmp
int
memcmp
(
const
void *
ptr1
,
const
void *
ptr2
,
size_t
num
);
比较从
ptr1
和
ptr2
指针开始的
num
个字节 。
第一个字符串大于第二个字符串,则返回大于
0
的数字
第一个字符串等于第二个字符串,则返回
0
第一个字符串小于第二个字符串,则返回小于
0
的数字
- 14 memset
void *memset( void *dest, int c, size_t count );
把从dest地址开始的count个·字符置为c或者以c为ASCII的字符。