<string.h>库中有很多常用的字符串函数,萌新博主在此做了一些小总结.
目录
1.strlen
函数原型:size_t strlen ( const char * str );
功能:计算字符串长度.
参数:str 要计算的字符串
返回值:返回字符串长度不包括'\0'
示例:
int main()
{
char str[] = "abcdef";
printf("%d\n", strlen(str));
//结果为6
return 0;
}
模拟实现:
//计数器方法
int my_strlen1(const char *str)
{
int count = 0;
assert(str);
while (*str++)
{
count++;
}
return count;
}
//指针减指针
int my_strlen2(const char *str)
{
char *p = str;
assert(str);
while (*str)
str++;
return str - p;
}
//递归
int my_strlen2(const char *str)
{
assert(str);
if (*str != '\0')
{
return 1 + my_strlen(str + 1);
}
else
{
return 0;
}
}
2.strcpy
函数原型:char* strcpy(char * destination, const char * source );
功能:将一个字符串拷贝到另一处
参数:source 要拷贝的字符串源头; destination 将要拷贝字符串放置的位置;
返回值:返回拷贝完成的字符串的地址
注意:将要放置字符串的位置的空间应该大于将要拷贝的字符串.
示例:
int main()
{
char str1[10] = { 0 };
char str2[] = "abcdef";
printf("%s\n", strcpy(str1, str2));
//结果为abcdef
return 0;
}
模拟实现:
char* my_strcpy(char *dest, const char *src)
{
char *tmp = dest;
assert(dest && src);
while (*src)
{
*dest = *src;
src++;
dest++;
}
return tmp;
}
3.strcat
函数原型:char * strcat ( char * destination, const char * source );
功能:将一个字符串拷贝到另一个字符串末尾.
参数:source 将要拷贝的字符串,destination 拷贝到这个字符串的末尾
返回值:返回拷贝完成后的地址
示例:
int main()
{
char str1[10] = "abc";
char str2[] = "def";
printf("%s\n", strcat(str1, str2));
//结果abcdef
return 0;
}
模拟实现:
char* my_strcat(char *dest, const char *src)
{
char *tmp = dest;
assert(dest && src);
while (*dest)//找到结尾
dest++;
while (*src)
{
*dest++ = *src++;
}
return tmp;
}
4.strcmp
函数原型:int strcmp ( const char * str1, const char * str2 );
功能:字符串比较,按ASCII码表比较字符
参数:str1,str2 将要比较的两个字符串
返回值:str1大于str2返回大于0的数字:str1等于str2返回0;str1小于str2返回小于0的数字
示例:
int main()
{
char str1[] = "abcd";
char str2[] = "acde";
int tmp = strcmp(str1, str2);
if (tmp > 0)
{
printf("str1 > str2\n");
}
else if (tmp < 0)
{
printf("str1 < str2\n");
}
else
{
printf("str1 = str2\n");
}
//结果str1 < str2
return 0;
}
模拟实现:
int my_strcmp(const char *dest, const char *src)
{
assert(dest && src);
while (*dest == *src && *dest)
{
dest++;
src++;
}
return *dest - *src;
}
5.strncpy
函数原型: char * strncpy ( char * destination, const char * source, size_t num );
功能: 拷贝n个字符从源字符串到目标空间.
参数: destination 拷贝目的地 source 拷贝源头 num 拷贝字符的个数
返回值: 返回拷贝完成后的地址
示例:
int main()
{
char str1[] = "abcdefg";
char str2[10] = { 0 };
printf("%s\n", strncpy(str2, str1, 3));
//结果abc
return 0;
}
6.strncat
函数原型: char * strncat ( char * destination, const char * source, size_t num );
功能: 将源头的n个字符拷贝到目的地末尾再加上'\0'
参数: destination 拷贝目的地, sourse 拷贝源头, num 拷贝的个数
返回值: 返回拷贝完成后的地址
示例:
int main()
{
char str1[10] = "abc";
char str2[] = "defgh";
printf("%s\n", strncat(str1, str2, 3));
//结果abcdef
return 0;
}
7.strncmp
函数原型: int strncmp ( const char * str1, const char * str2, size_t num );
功能: 比较到出现不一样的字符或者一个字符串结束或者n个字符全部比较完.
参数: str1,str2 两个要比较的字符串 num 要比较的字符个数
返回值: str1大于str2返回大于0的数字:str1等于str2返回0;str1小于str2返回小于0的数字
示例:
int main()
{
char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
int n;
puts("Looking for R2 astromech droids...");
for (n = 0; n < 3; n++)
if (strncmp(str[n], "R2xx", 2) == 0)
{
printf("found %s\n", str[n]);
}
//结果:
//found R2D2
//found R2A6
return 0;
}
8.strstr
函数原型: char * strstr ( const char *str1, const char * str2);
功能: 字符串查找函数,在字符串str1中查找字符串str2
参数: str1将要被查找的字符串,str2将要查找的字符串
返回值: 返回查找到相同位置的地址
示例:
//示例1
int main()
{
char str1[] = "hello whord!";
char str2[] = "ell";
printf("%s", strstr(str1, str2));
//结果ello whord!
return 0;
}
//示例2
int main ()
{
char str[] ="This is a simple string";
char * pch;
pch = strstr (str,"simple");
strncpy (pch,"sample",6);
puts (str);
//结果This is a simple string
return 0;
}
9.strtok
函数原型: char * strtok ( char * str, const char * sep );
功能: 在字符串中找分隔符标志,然后进行分割
参数 str 将要被查找的字符串,sep 分隔符的字符串可以是多个分隔符
返回值: 第一次调用返回第一段字符串的地址 , 当str参数输入NULL时返回下一段字符串的地址,字符串结束时返回NULL
示例:
int main()
{
char str1[] = "hell#o wh$ord";
char str2[] = "#$";
char* pstr = NULL;
for (pstr = strtok(str1, str2); pstr; pstr = strtok(NULL, str2))
{
printf("%s\n", pstr);
}
//结果
//hell
//o wh
//ord
return 0;
}
10.strerror
函数原型: char * strerror ( int errnum );
功能: 根据错误码返回错误信息
参数: ermun 错误码
返回值: 错误信息的地址
补充:strerror函数配合全局变量errno使用
errno头文件<errno.h>
printf("错误信息: %s", strerror(errno));
11.memcpy
函数原型: void * memcpy ( void * destination, const void * source, size_t num );
功能: 内存拷贝
参数 destination 拷贝的目的地 source 拷贝的源头 num 拷贝的字节数
返回值: 返回void*类型的 目的地的地址
示例
int main()
{
int a[] = { 1, 5, 6, 848, 4, 11, 3, 51, 9 };
int b[20] = { 0 };
int i = 0;
memcpy(b, a, sizeof(int) * 8);
for (i = 0; i < 20; i++)
{
printf("%d ", b[i]);
}
//结果1 5 6 848 4 11 3 51 0 0 0 0 0 0 0 0 0 0 0 0
return 0;
}
模拟实现:
void* my_memcpy(void* dest, const void* src, size_t n)
{
void* tmp = dest;
assert(dest);
assert(src);
while (n--)
{
*(char*)dest = *(char*)src;
(char*)dest += 1;
(char*)src += 1;
}
return tmp;
}
12.memmove
函数原型: void * memmove ( void * destination, const void * source, size_t num );
功能:功能和memmove相同但是可以处理字符串重叠的情况,可以取代memcpy
参数: destination 拷贝的目的地 source 拷贝的源头 num 拷贝的字节数
返回值: 返回void*类型的 目的地的地址
模拟实现:
void* my_memmove(void* dest, const void* src, size_t n)
{
void* tmp = dest;
assert(dest);
assert(src);
if (dest < src)//从前往后拷贝
{
while (n--)
{
*(char*)dest = *(char*)src;
src = (char*)src + 1;
(char*)dest += 1;
}
}
else
{
while (n--)
{
*((char*)dest + n - 1) = *((char*)src + n - 1);
}
}
return tmp;
}
13.memcmp
函数原型: int memcmp ( const void * ptr1, const void * ptr2, size_t num );
功能:内存比较函数,按字节进行比较,
参数: ptr1 ptr2将要比较的两个内存地址 num 要比较的字节数
返回值: ptr1大于ptr2返回大于0的数字:ptr1等于ptr2返回0;ptr1小于ptr2返回小于0的数字