C语言基础篇四

一、自定义求数组长度的函数。

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;
}

八、大小端

  • 大端:低地址放高数据
  • 小端:低地址放低数据
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43313035/article/details/83244686