面试中常常要求写一些基本的库函数,尤其以字符串库函数考的最多,本文汇总了一些常见的字符串库函数。
一般地,使用这些函数,需要包含头文件:
#include
一、strlen 函数功能:
求字符串长度的函数。
函数原型:
size_t strlen ( const char * str );
函数说明:
- 字符串以'\0'作为结束标志,strlen函数返回的是字符串'\0'前面出现的字符个数(不包括'\0')
- 函数的返回值为size_t,是无符号的
#include
#include
int main()
{
const char* str1 = "abcdef";
const char* str2 = "bbb";
if (strlen(str2) - strlen(str1) > 0)
{
printf("hello\n");
}
else
{
printf("hallo\n");
}
return 0;
}
结果如下:
文章图片
因为strlen函数的返回值是无符号的,所以strlen(str2)-strlen(str1)的结果为3,故输出的结果为hello。
模拟实现:
#include
#include int my_strlen(const char *p)
{
assert(p);
//判断指针是否为空
int count = 0;
while (*p != '\0')
{
count++;
p++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
二、strcpy 字符串复制函数。
函数功能:
将源字符串拷贝到目标空间中。
函数原型:
char* strcpy(char * destination, const char * source );
函数说明:
- 源字符串必须以'\0'结束
- 目标空间必须可变并且足够大,从而确保可以存放源字符串
- 拷贝时,源字符串中的'\0'会被拷贝到目标空间中
#include
#include char * my_strcpy(char* dest, const char* src)
{
assert(dest != NULL);
//判断指针是否为空
assert(src != NULL);
char * ret = dest;
while (*dest++ = *src++) //拷贝src指向的字符串到dest指向的空间
{
;
}
//返回目的空间起始位置
return ret;
}
int main()
{
char arr1[] = "abcdef";
//目标空间必须足够大
char arr2[] = "bit";
my_strcpy(arr1, arr2);
printf("%s\n",arr1);
return 0;
}
三、strcat 字符串追加函数。
函数原型:
char * strcat ( char * destination, const char * source );
函数说明:
- 源字符串必须以'\0'结束
- 目标空间必须可变并且足够大,从而确保可以存放源字符串
- 追加时,是从目标空间的'\0'处开始追加
因为:
自己给自己追加时,例如字符串“abcdef”,实际上是abcdef\0,那么在自己给自己追加的时候,把a放到\0的位置,b,c,d,e,f一次放到后面,之后发现\0不在了,已经被改成a了,没有\0(没有到结束位置),没办法停止,故程序会崩溃。
模拟实现:
#include
#include char * my_strcat(char* dest, const char* src)
{
assert(dest);
assert(src);
char* ret = dest;
while (*dest)//找到目标字符串中'\0'
{
dest++;
}
while (*dest++ = *src++) //追加
{
;
}
return ret;
}
int main()
{
//在数组arr1后面追加字符串arr2
char arr1[10] = "abc";
char arr2[] = "bcd";
printf("%s\n", my_strcat(arr1, arr2));
return 0;
}
四、strcmp 字符串比较函数。
函数说明:
- 通过比较字串中各个字符的ASCII码,来比较参数str1和str2字符串,比较时考虑字符的大小写
- 字符串str1大于str2,返回大于0的数字;字符串str1等于str2,返回0;字符串str1小于str2,返回小于0的数字
int strcmp ( const char * str1, const char * str2 );
模拟实现:
#include
#include int my_strcmp(const char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
while (*dest == *src)
{
if (*dest == '\0')
{
return 0;
//两个字符串相等
}
dest++;
src++;
}
if (*dest > *src)
{
return 1;
//大于
}
else
{
return -1;
//小于
}
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abd";
int ret = my_strcmp(arr1, arr2);
printf("ret=%d\n", ret);
return 0;
}
五、strstr 找出str1字符串在str2字符串中第一次出现的位置(不包括str1的’\0’)。
函数原型:
char * strstr ( const char *str2, const char * str1);
- strstr 返回该位置的指针,如找不到,返回空指针。
#include
#include char * my_strstr(const char* dest, const char* src)
{
assert(dest);
//判断指针是否为空
assert(src);
char* ret1 = dest;
char* ret2 = src;
char* cur = dest;
if (*src =https://www.it610.com/article/='\0')
{
return dest;
//如果需要查找的字符串arr2为空,那么返回字符串arr1的首地址
}
while (*dest)
{
ret1 = cur;
ret2 = src;
while ((*ret1 != '\0') && (*ret2 != '\0') && (*ret1 == *ret2))
{
ret1++;
ret2++;
}
if (*dest == "\0")
{
return ret1;
}
cur++;
}
return NULL;
}
int main()
{
char arr1[] = "abccdef";
char arr2[] = "cde";
char * ret = my_strstr(arr1, arr2);
//查找arr2字符串是否在arr1字符串中
if (ret == NULL)
{
printf("?\n");
}
else
{
printf("%s\n",ret);
}
return 0;
}
六、strncpy函数原型:
char * strncpy ( char * destination, const char * source, size_t num );
函数说明:
- 拷贝num个字符从源字符串到目标空间
- 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0('\0'),直到num个
#include
#include
int main()
{
char arr1[10] = "abcdef";
char arr2[] = "bit";
strncpy(arr1, arr2, 6);
return(0);
}
七、strncat 函数原型:
char * strncat ( char * destination, const char * source, size_t num );
函数功能:
把source所指字符串的前n个字符添加到destination结尾处(覆盖dest结尾处的’\0’),并添加’\0’ 。
函数说明:
- source和destination所指内存区域不能重叠
- destination必须有足够的空间来容纳source的字符串
#include
#include
int main ()
{
char str1[20];
char str2[20];
strcpy (str1,"To be ");
strcpy (str2,"or not to be");
strncat (str1, str2, 6);
puts (str1);
return 0;
}
八、strncmp 函数原型:
int strncmp ( const char * str1, const char * str2, size_t num );
函数功能:
比较字符串str1和str2的前num个字符。
函数说明:
如果前num字节完全相等,返回值就为0;在前num字节比较过程中,如果出现*str1与*str2不等,则返回(*str1-*str2)。
【c语言|C语言-字符串库函数详解(含部分函数的模拟实现)】函数实现:
#include
#include int main()
{
const char *p1 = "abczdef";
char *p2 = "abcqwer";
int ret = strncmp(p1, p2, 4);
printf("%d\n", ret);
return 0;
}
推荐阅读
- c语言|(C语言)strstr库函数的简单使用以及模拟实现
- Offer 提速(如何写出有亮点的简历)
- linux远程开发|linux远程开发——使用vs2019远程连接linux
- FFmpeg音视频|Qt结合FFmpeg转码码流数据(h264)生成不同视频格式(mp4、mov、flv、avi等)
- 网络安全|测试攻击机伪装成目标机 IP 给目标机发送攻击报文是否成功
- 嵌入式|网上五花八门的单片机教程,到底应该怎么整理学习过程
- 嵌入式|单片机有没有想象中那么好学,很迷茫有说正面有说负面
- 思维|天气预报(牛客)
- 算法|Acwing1230. K倍区间