面试中常常要求写一些基本的库函数,尤其以字符串库函数考的最多,本文汇总了一些常见的字符串库函数。
一般地,使用这些函数,需要包含头文件:
#include
函数功能:
求字符串长度的函数。
函数原型:
size_t strlen ( const char * str );
函数说明:
下面通过一个例子解释返回值是无符号这个概念:
#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;
}
字符串复制函数。
函数功能:
将源字符串拷贝到目标空间中。
函数原型:
char* strcpy(char * destination, const char * source );
函数说明:
模拟实现:
#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;
}
字符串追加函数。
函数原型:
char * strcat ( char * destination, const char * source );
函数说明:
那么,字符串可以给自己 追加吗?答案是 否定的。(可以用strncat实现)
因为:
自己给自己追加时,例如字符串“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;
}
字符串比较函数。
函数说明:
函数原型:
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;
}
找出str1字符串在str2字符串中第一次出现的位置(不包括str1的’\0’)。
函数原型:
char * strstr ( const char *str2, const char * str1);
模拟实现:
#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 == '\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;
}
函数原型:
char * strncpy ( char * destination, const char * source, size_t num );
函数说明:
函数实现:
#include
#include
int main()
{
char arr1[10] = "abcdef";
char arr2[] = "bit";
strncpy(arr1, arr2, 6);
return(0);
}
函数原型:
char * strncat ( char * destination, const char * source, size_t num );
函数功能:
把source所指字符串的前n个字符添加到destination结尾处(覆盖dest结尾处的’\0’),并添加’\0’ 。
函数说明:
函数实现:
#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;
}
函数原型:
int strncmp ( const char * str1, const char * str2, size_t num );
函数功能:
比较字符串str1和str2的前num个字符。
函数说明:
如果前num字节完全相等,返回值就为0;在前num字节比较过程中,如果出现*str1与*str2不等,则返回(*str1-*str2)。
函数实现:
#include
#include
int main()
{
const char *p1 = "abczdef";
char *p2 = "abcqwer";
int ret = strncmp(p1, p2, 4);
printf("%d\n", ret);
return 0;
}