大家好,本篇文章主要讲的是C语言字符串函数操作(strlen,strcpy,strcat,strcmp)详解,感兴趣的同学赶快来看一看吧
一.strlen函数模拟
字符串以‘\0’作为结束标志,strlen函数返回的是在字符串中‘\0’前面出现的字符个数(不包括‘\0’);
有三种方法可以实现该操作:
①计数器方式
②不能创建临时变量计数器
③指针-指针
方法一:计数器方式
int my_strlen(const char* str)
{
int count = 0;//定义count用来记录字符串数组中字符数
while (*str)
{
count++;
str++;
}
return count;
}
方法二:不能创建临时变量计数器
int my_strlen1(const char* str)//以递归的方式完成字符串长度函数的模拟
{
if (*str == '\0')
return 0;
return 1 + my_strlen1(str + 1);
}
方法三:指针-指针
指针相减得到的是两个指针之间差距的元素个数,可以根据这种方式来实现strlen函数的模拟
int my_strlen2(char* s)//以此方式进行模拟时不能使用静态const
{
char* p = s;
while (*p != '\0')
p++;
return p - s;
}
测试样例
二. strcpy函数模拟
将src所指向的字符串包括‘\0’复制到dest所指向的字符串中
源字符串(src所指向的字符串)必须以‘\0’结束
目标空间需足够大,以确保能存放源字符串
int main()
{
char s[10] = { 'a','b','c','d','e','f' };
char s1[10] = { 'c','c','b' };
printf("%s", my_strcpy(s, s1));//将s1中的字符复制到s空间中
return 0;
}
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
assert(dest != NULL);//断言
assert(src != NULL);//断言
while ((*dest++ = *src++));
return ret;
}
测试结果
最终将s2中以‘\0’为结束符的字符串复制到s中
三.strcat函数模拟
将src所指向的字符串包括‘\0’复制到dest所指向的字符串后面
源字符串必须以‘\0’结束
目标空间*dest需足够大,以确保能够存放源字符串(*src)
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest)//访问到dest所指向字符串的最后一个字符位置
{
dest++;
}
while ((*dest++ = *src++));//将src指向的字符串复制到dest所指向字符串的后面
return ret;
}
测试样例
将src指向的字符串复制到dest指向的字符串后面,最终得到结果
四.strcmp函数模拟
strcmp函数的作用是比较字符串,用法如下strcmp(字符串1,字符串2),它会比较这两个字符串:
如果字符串1等于字符串2,strcmp函数返回0;
如果字符串1小于字符串2,strcmp函数返回一个负值;
如果字符串1大于字符串2,strcmp函数返回一个正值.
具体实现如下:
int my_strcmp(const char* dest, const char* src)
{
int ret = 0;
assert(src != NULL);
assert(dest != NULL);
while (!(ret = *(unsigned char*)src - *(unsigned char*)dest) && *dest)
{
++src;
++dest;
}
if (ret < 0)
ret = -1;
else if (ret > 0)
ret = 1;
return ret;
}
总结
到此这篇关于C语言字符串函数操作(strlen,strcpy,strcat,strcmp)详解的文章就介绍到这了,更多相关C语言字符串函数内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:C语言字符串函数操作(strlen,strcpy,strcat,strcmp)详解
- XML Schema 到 C++ 类 2022-01-01
- 将 hdc 内容复制到位图 2022-09-04
- GDB 不显示函数名 2022-01-01
- 将函数的返回值分配给引用 C++? 2022-01-01
- DoEvents 等效于 C++? 2021-01-01
- 如何提取 __VA_ARGS__? 2022-01-01
- 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值 2021-01-01
- 哪个更快:if (bool) 或 if(int)? 2022-01-01
- 使用 __stdcall & 调用 DLLVS2013 中的 GetProcAddress() 2021-01-01
- OpenGL 对象的 RAII 包装器 2021-01-01