🌹作者:小泽同学~
📝csdn个人主页:小泽同学~
📝码云:classmate-mzq
🤟motto:己所不欲,勿施于人and勿以善小而不为,勿以恶小而为之
————————————————
前言:不出意外的话,我将在这里记录我的大学编程学习。
因为我也是小白,所以如果大家看到问题的话,可以直接在下面评论或者加我v私我,感谢大家!
个人v:m0106gm(添加的话麻烦备注csdn)
祝我们前程似锦
本人使用的开发环境工具是vs2022
文章目录
1.strlen
- 作用:求字符串的长度
【字符串以\0
结尾,用strlen计算字符串长度的时候,\0
不算】 - 函数原型:
size_t strlen ( const char * str );
【返回类型size_t
相当于unsigned
即无符号整型(因为字符串长度不可能是负数), 返回的就是字符串的长度;参数是指针类型,被const修饰,因为我们求的是字符串长度,不需要更改字符串,所以用const修饰可以防止传过来的指针被修改】 - 头文件:
string.h
相关信息参考:strlen
实例:
#include <stdio.h>
#include <string.h>
int main()
{
char* p = "i love you!";
printf("%d", strlen(p));
return 0;
}
打印11
模拟实现:
#include <stdio.h>
//返回类型是否写size_t其实都一样,因为count不可能为负数,写size_t的优点就是范围大了一倍而已;
//如果返回类型写size_t,count变量的类型也应该用size_t
int my_strlen(const char* p)
{
int count = 0; //用来计数
while (*p!='\0') //当*P不等于斜杠0
{
count++; //count加1
p++; //p向后移动一位
}
return count; //返回
}
int main()
{
char* p = "i love you!";
printf("%d", my_strlen(p));
return 0;
}
打印11
函数也可以简写成:
//1. *p不等于'\0'就停下,非0为真,所以!='\0'可以直接省略;2. 直接后置++
int my_strlen(const char* p)
{
int count = 0;
while (*p++)
count++;
return count;
}
进行优化:
想一下,当我们传进函数的指针为空指针时,会怎么样?
有的编译器会直接报错,有的编译器虽然没有报错但是进行打印时显示器也没有进行打印。为什么?因为空指针是不能进行解引用的!
那如何规避呢?——使用函数assert进行断言
函数assert
- 作用:进行断言:判断参数是否为0,如果是则进行报错提醒,如果不是则正常运行(包括
0
'\0'
NULL
) - 函数原型:
void assert (int expression);
- 头文件:
assert.h
相关信息参考:assert
优化代码:
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* p)
{
assert(p);
int count = 0;
while (*p++)
count++;
return count;
}
int main()
{
char* p = NULL;
printf("%d", my_strlen(p));
return 0;
}
p是空指针,用assert进行断言,会有报错提醒
line 6是第六行的意思,即发生错误的行数,前面的是文件路径
2.strcpy
- 作用:字符串拷贝,将一个字符串的内容拷贝到另一个字符串
- 函数原型:
char * strcpy ( char * destination, const char * source );
【返回类型和参数均为指针类型,第一个参数是目标字符串,第二个字符串是源头字符串,即把第二个字符串的内容拷贝到第一个字符串里面去。因为源头字符串不需要改动,所以用const修饰可以防止源头字符串被改动】 - 头文件:
string.h
相关信息参考:strcpy
//代码1
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = {
0 };
char arr2[] = "i love you!";
strcpy(arr1, arr2); //把arr2的内容拷贝到arr1中
printf("%s", arr1);
return 0;
}
//代码2
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "i love myself";
char arr2[] = "i love you!";
strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
arr1的内容比arr2的多,但是拷贝后也只是打印了arr2原本的字符。表明:字符串拷贝的时候,\0
也会被一同拷贝
使用strcpy的注意事项:目标字符串的大小一定要比源头字符串的大小大,否则会报错
模拟实现:
#include <stdio.h>
#include <assert.h>
void my_strcpy(char *des,const char* sou)
{
assert(des);//进行断言,判断des和sou是不是空指针
assert(sou);
//*sou不等于'\0\时,说明sou还没有结束,则进行拷贝
while (*sou != '\0')
{
*des = *sou; //拷贝
des++; //向后移动一位
sou++;
}
//因为当*sou!='\0'时结束循环,所以实际上'\0'还并没有进行赋值,所以循环结束后要单独进行赋值
*des = '\0';
}
int main()
{
char des[] = "i love you!";
char sou[] = "love you!";
my_strcpy(des, sou);
printf("%s", des);
return 0;
}
打印:love you!
函数也可以简写成:
//1.直接后置++ ;2. 直接相等,省去循环后还要赋值;3.当*sou='\0'时表达式为0,则停止循环
void my_strcpy(char *des,const char* sou)
{
assert(des);
assert(sou);
while (*des++=*sou++)
{
;
}
}
代码优化:
strcpy的函数原型为char * strcpy ( char * destination, const char * source )
可以看到是有返回值的,返回我们的目标字符串的地址即目标指针destination
那么可以这么写吗?
#include <assert.h>
char* my_strcpy(char* des, const char* sou)
{
assert(