一、自定义求数组长度的函数。
int My_strlen(char *src)
{
int len = 0;
while(*src++ != '\0')
{
len++;
}
return len;
}
二、自定义strcpy函数。
(1)
void My_strcpy(char *dest,const char *src)//j加const预防原字符串被修改
{
assert(dest != NULL && src != NULL);//断言
int i = 0;
for(i = 0;src[i] != '\0';i++)
{
dest[i] = src[i]; //*(src+i)
}
dest[i] = '\0'; //手动赋值'\0'
}
(2)
void My_strcpy2(char *dest,const char *src)
{
assert(dest != NULL && src != NULL);
while(*src != '\0')
{
*dest = *src;
dest++;//dest+1
src++;//src+1
}
*dest = '\0';
}
(3)
void My_strcpy3(char *dest,const char *src)
{
assert(dest != NULL && src != NULL);
while(*dest++ = *src++)//最后while表达式的值为0,循环进不去,但是已经进行了赋值
{
}
}
(4)
char * My_strcpy4(char *dest,const char *src)
{
char *p = dest;//将dest保护起来
assert(dest != NULL && src != NULL);
while(*dest++ = *src++) {}
return p;//返回值为指针
}
int main()
{
char *str2 = "hello";
char str3[6] = {};
char *p = My_strcpy4(str3,str2);//字符串拷贝函数
printf("%s\n",p);
return 0;
}
三、删除字符数组中的偶数
int Fun(int *arr,int len)
{
int j = 0;//放奇数的下标
for(int i = 0;i < len;i++)
{
if(arr[i] % 2 != 0) //奇数
{
arr[j] = arr[i];
j++;
}
}
return j;
}
四、大小端判断
bool IsBig()
{
int a = 0x12345678;
char *p = (char *)&a;//p指针只能访问一个字节
if(*p == 0x78)
{
return false;//小端
}
else
{
return true;//大端
}
}
五、
char *str=“hello”;
char *str2=“hello”;
printf("%d,%d",str,str2);//两个值相等,相当于两个指针同时指向rodata段的同一个字符串。
六、
int a[10]={1,2,3};
a+sizeof(int)//相当于&a[4]
&a[0]+1//等价于&a[1]
(int *)&a+1//加1相当于加4个字节,则加到了a[1]的地址
(int *)((char *)a+sizeof(int))// sizeof(int)的值为4,char *a+sizeof(int)加了4个字节,再强转为(int *)类型,指向a[1]的地址。
七、调用拷贝函数应注意的
#include<stdio.h>
#include<string.h>
int main()
{
char *str="tulun";
char *str2="hello";
char str3[5]={};
printf("%s",strcpy(str3,str2));//错误(先打印,后报错),"hello"字符串长度为6,str3数组的长度为5,越界
return 0;
}
八、大小端
- 大端:低地址放高数据
- 小端:低地址放低数据