C语言笔记

news2024/12/23 9:42:38

fabs用来求double类型的绝对值,小数点后保留6位#include<math.h>
double fabs(double )
labs用来求长整型long整型的绝对值, long cabs(long n);
abs用来求整数的绝对值,labs求long long的绝对值#include<stdlib.h>

    double ret = fabs(3.14 - 5.26);
	printf("%f\n", ret);
	printf("%d\n",abs(3-5));
	printf("%d\n",abs(5555555555-6666666666));

###################################################################

    char* p = "hello";
	printf("%d\n", strlen(&p));//随机值
	char arr[] = {"hello"};
	printf("%d",strlen(&arr));//5

#################################################################
typedef u nion {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
则语句printf(“%d”,sizeof(struct date)+sizeof(max)); 的
执行结果是:_____
【标准答案】DATE是一个union, 变量公用空间. 里面最
大的变量类型是int[5], 占用20个字节. 所以它的大小是
20
data 是一个struct, 每个变量分开占用空间. 依次为int4 +
DATE20 + double8 = 32.
所以结果是20 + 32 = 52.
当然… 在某些16位编辑器下, int 可能是2字节,那么结果
是int2 + DATE10 + double8 = 20

###################################################################

函数指针,指针函数详解
##################################################################
下面的地址是相等的
(1)能够输出hello
(2)内存泄漏 //没有释放

void GetMemory2(char** p, int num)
{
	*p = (char*)malloc(num);

	printf("*p=%p\n", *p);//------------------地址1
}
void Test(void)
{
	char* str = NULL;
	GetMemory2(&str, 100);

	printf("str=%p\n", str); //------------------地址2 == 地址1
	strcpy(str, "hello");
	printf(str);
}

int main()
{
	Test();
	return 0;
}

###################################################################
在这里插入图片描述
###################################################################
main函数的返回值用于说明程序的退出状态:
如果返回0(return 0),则代表程序正常退出。通常,返回非零代表程序异常退出(可自行设定:如 return -1)。
return 后面是个变量a,则意思是返回a这个变量。
return 后面没有任何参数,就是执行到这一行以后 返回原函数,其实也就是中断函数执行,返回调用函数处,注意区别:break只是退出所在的循环体。
return 的意思是返回一个空值 其意义在于 这可以当成一个用于返回主函数的命令,而不是再当一个返回值用。

mian中,c标准认为0表示成功,非0表示错误(异常终止)。具体的值是某中具体出错信息。
###################################################################
static 和extern
在两个不同的源文件中,如果同时用static定义一个全局变量,变量名和值的是一样的
它们之所以可以连接成功而没有报重复定义的错误是因为虽然它们有相同的内容,但是存储的物理地址并不一样, 就像是两个不同变量赋了相同的值一样,而这两个变量分别作用于它们各自的编译单元。
也许你比较较真,自己偷偷的跟踪调试上面的代码,结果你发现两个编译单元(test1, test2)的g_str的内存地址相同,于是你下结论static修饰的变量也可以作用于其他模块,但是我要告诉你,那是你的编译器在欺骗你,大多数编 译器都对代码都有优化功能,以达到生成的目标程序更节省内存,执行效率更高,当编译器在连接各个编译单元的时候,它会把相同内容的内存只拷贝一份,比如上 面的"123456", 位于两个编译单元中的变量都是同样的内容,那么在连接的时候它在内存中就只会存在一份了。

在两个源文件中,其中一个源文件中定义了一个全局变量,和一个函数,函数可以在另一个源文件中直接使用,但是会有报警,最好也生名义一下,而全局变量没有声明就不能再其他的源文件中使用。

###################################################################
一语句实现x是否为2的若干次幂的判断

一语句实现x是否为2的若干次幂的判断

#define is2*n(x)  ((x & (x - 1))? 0 : 1)

int main(void)

{

        int m = 512;

        cout << ((m & (m - 1)) ? false : true) << endl;

        //即当m中只有一位为1时,才为若干次幂值

//若有两个及以上1,则(m & (m - 1))不为0,输出0,表示不为2的若干次幂

        return(0);

}

##################################################################
在过程中就转化为无符号整数了,而并不是先对(6-20)运算完在进行无符号转换

void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b> 6)? puts("> 6") : puts("<= 6");
}
//【参考答案】这个问题测试你是否懂得C 语言中的整数自动转换原则,
//我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答
//案是输出是“>6” 。原因是当表达式中存在有符号类型和无符号类型时所有
//的数都自动转换为无符号类型。因此-20 变成了一个非常大的正整数,所
//以该表达式计算出的结果大于6 。这一点对于应当频繁用到无符号数据类
//型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了
//得不到这份工作的边缘。

printf("b=%u\n", b);  //b=4294967276

//a+b = 6+(-20) = 6 + 4294967276 = 4294967282

###################################################################
malloc申请一段长度为0的空间,malloc依然会返回一段地址,还有一段地址空间,所以ptr不等于NULL。malloc这个函数,会有一个阈值,申请小于这个阈值的空间,那么会返回这个阈值大小的空间。如阈值为24,那么申请小于24的值就会返回24

数组越界和动态开辟空间越界动态开辟空间不止自己输入的数量,还会有一些用来存放开辟空间的信息,free为什么释放空间没有大小,因为在malloc开辟空间的时候已经存放了这些信息,开辟的空间不止自己设定的大小

在这里插入图片描述

在这里插入图片描述

##################################################################
assert中debug和release的区别,
这里告诉我们判段指针是否为空最好用下面的方法

char* str=NULL;
if(str==NULL)
{
     return;
}

在这里插入图片描述
在这里插入图片描述
###################################################################
数字转换为字符串

#define _CRT_SECURE_NO_WARNINGS 1


#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
//数字转换为字符串

char* Change(int num, char** str)
{
	*str = (char*)malloc(40);//calloc或者if((*str)==NULL)
	int c = num;;
	int b = 0;
	int len = 0;
	if (num < 0)
	{
		b = 1;
	}
	if (b == 1)
	{
		len++;
		c *= -1;
	}
	while (c > 0)
	{
		c /= 10;
		len++;
	}
	c = num;
	if (b == 1)
	{
		
		c*= -1;
		(*str)[0] = '-';
	}
	int i = 0;
	while (c > 0)
	{
		(*str)[len - 1 - i] = (c % 10) + '0';
		c /= 10;
		i++;
	}
	(*str)[len] = '\0';//注意,取消对NULL引用
	return *str;
}

int main()
{
	int a = -1234;
	char* p = NULL;
	Change(a, &p);
	//int f = 0;
	printf("%s", p);
	free(p);
	p = NULL;
	return 0;
}


//错误
//void IntToCharChange1(int num, char* pval)
//{
//    //判断正负号 
//    char negFlag = 0;
//    if (num < 0)
//    {
//        negFlag = 1;
//    }
//
//    //计算字符串长度 
//    int len = 0;
//    int tmp_num = num;
//    if (negFlag)
//    {
//        tmp_num *= -1;
//        len++;
//    }
//    while (tmp_num > 0)
//    {
//        len++;
//        tmp_num /= 10;
//    }
//
//    //转成字符串 
//    tmp_num = num;
//    if (negFlag)
//    {
//        tmp_num *= -1;
//        pval[0] = '-';
//    }
//
//    int val;
//    int i = 0;
//    while (tmp_num > 0)
//    {
//        val = tmp_num % 10;
//        pval[len - i - 1] = val + '0';
//        tmp_num = tmp_num / 10;
//        i++;
//    }
//    pval[len] = '\0';
//}
//
//int main(int argc, char* argv[])
//{
//    if (1)
//    {
//        int num1 = 1234;
//        char* str1;
//        IntToCharChange1(num1, str1);
//        printf("%s\n", str1);
//
//        int num2 = -1234;
//        char* str2;
//        IntToCharChange1(num2, str2);
//        printf("%s", str2);
//    }
//    return 0;
//
//}

//数组
void IntToCharChange1(int num, char* pval)
{
    //判断正负号 
    char negFlag = 0;
    if (num < 0)
    {
        negFlag = 1;
    }

    //计算字符串长度 
    int len = 0;
    int tmp_num = num;
    if (negFlag)
    {
        tmp_num *= -1;
        len++;
    }
    while (tmp_num > 0)
    {
        len++;
        tmp_num /= 10;
    }

    //转成字符串 
    tmp_num = num;
    if (negFlag)
    {
        tmp_num *= -1;
        pval[0] = '-';
    }

    int val;
    int i = 0;
    while (tmp_num > 0)
    {
        val = tmp_num % 10;
        pval[len - i - 1] = val + '0';
        tmp_num = tmp_num / 10;
        i++;
    }
    pval[len] = '\0';
}

int main(int argc, char* argv[])
{
    if (1)
    {
        int num1 = -1234;
        char str1[10] = { 0 };
        IntToCharChange1(num1, str1);
        int m = 0;
        while (str1[m] != '\0')
        {
            printf("%c", str1[m]);
            m++;
        }

        /* int num2 = -1234;
         char* str2=NULL;
         IntToCharChange1(num2, str2);
         printf("%s", str2);*/
    }
    return 0;

}

###################################################################
在字符串中查找有几个单词

int show(char* arr)
{
	int a = 0;
	int b = 0;
	int words = 0;
	while (*arr)
	{
		if ((*arr >= 'a' && *arr <= 'z') || (*arr >= 'A' && *arr <= 'Z'))
		{
			a = 1;
		}
		if (a == 1 && b == 0)
		{
			words++;
		}
		b = a;
		a = 0;
		arr++;
	}
	return words;
}
int main()
{
	char* arr = "hello,he,hi,welcome to my home!";
	int ret=show(arr);
	printf("%d",ret);
	return 0;
}

###################################################################
有两个磁盘文件A和B, 各存放一行字母,要求把
这两个文件中的信息合并(按字母顺序排列),输出
到一个新文件C 中。
在读取文件的时候文件名的大小写是没有影响的

int main()
{
	FILE* pf;
	pf=fopen("A.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	fputs("aaccbb",pf);


	fclose(pf);
	//pf = NULL;

	pf = fopen("B.txt", "w");
	if (pf== NULL)
	{
		perror("fopen");
		return 0;
	}
	fputs("bbeeff", pf);


	fclose(pf);
	//p = NULL;
	char arr[50] = {0};
	pf = fopen("A.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	int i = 0;
	char ch;
	while ((ch=fgetc(pf) )!= EOF)
	{
		arr[i] = ch;
		i++;
	}
	fclose(pf);

	pf = fopen("B.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	while ((ch=fgetc(pf)) != EOF)//fgetc返回值EOF,开始写成了‘\0’了
	{
		arr[i] = ch;
		i++;
	}
	int n = i;
	int t = 0;
	for (i = 0; i < n; i++)
	{
		for (int j = i + 1; j < n; j++)
		{
			if (arr[i] > arr[j]) {
				t = arr[i];
				arr[i] = arr[j];
				arr[j] = t;
			}
		}
	}
	fclose(pf);
	//p1 = NULL;//结束时不要都置为空,因为后面还要用
	//在最后一个置为空就行了
	pf = fopen("C.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	fputs(arr,pf);

	fclose(pf);
	pf= NULL;

	return 0;
}

###################################################################
在这里插入图片描述
###################################################################################
负数整形的除法和取余
1.最重的一点,我们希望 q * b + r == a,因为这是定义余数的关系。
2.如果我们改变 a 的正负号,我们希望这会改变 q 的符号,但这不会改变 q 的绝对值。
3.当 b>0 时,我们希望保证 r >= 0 且 r < b。例如,如果余数用于哈希表的索引,确保 它是一个有效的索引值很重 。
这三条性质是我们认为整数除法和余数操作所应该具备的。很不幸的是,它们不可能同时成立。
考虑一个简单的例子:3/2,商为 1,余数也为 1。此时,第 1 条性质得到了满足。(-3)/2 的值应该是多少呢?如果 满足第 2 条性质,答案应该是-1,但如果是这样,余数就必定是-1,这样第 3 条性质就无法满足了。如果我们首先满足第 3 条性质,即余数是 1,这种情况下根据第 1 条性质则商是-2,那么第 2 条性质又无法满足了。
因此,C 语言或者其他语言在实现整数除法截断运算时,必须放弃上述三条原则中的至 少一条。大多数程序设计语言选择了放弃第 3 条,而改为 求余数与被除数的正负号相同。 这样,性质 1 和性质 2 就可以得到满足。大多数 C 编译器在实践中也都是这样做的。
例如求-8 % 3,因为-8 / 3 = -2,那么余数就是-8 - 3 * (-2) = -2。
####################################################################################
快速幂实现
分奇偶实现

#include<stdio.h>
#include<math.h>
int Pow(int x, int y)
{
	int ret = x;
	int f = 1;
	while (y > 1)
	{
		if (y % 2 == 1)
		{
			y--;
			f *= x;
		}
		else
		{
			ret *= ret;
			y/= 2;
		}
	}
	return ret * f;
}
int main()
{
	int a = 3;
	int b = 2;
	Pow(a, b);
	printf("%d", Pow(a,b));
	return 0;
}

###################################################################

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 比较版本号
 * @param version1 string字符串 
 * @param version2 string字符串 
 * @return int整型
 */
int compare(char* version1, char* version2 ) {
    const char *p=".";
   int arr1[3];
   int arr2[3];
   arr1[0]=atoi(strtok(version1,p));
   arr1[1]=atoi(strtok(NULL,p));
   arr1[2]=atoi(strtok(NULL,p));
   arr2[0]=atoi(strtok(version2,p));
   arr2[1]=atoi(strtok(NULL,p));
   arr2[2]=atoi(strtok(NULL,p));
   for(int i=0;i<3;i++)
   {
       
   }

 
    // write code here
}

##################################################################
二级指针及其以上的指针加1都是4个步长,无论什么类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初识C++ (二)

初识C 二 上节课输入输出问题的一些补充一. 缺省参数1.1 半缺省参数1.2 全缺省参数二. 函数重载2.1 重载是什么意思&#xff1f;2.2 如何区分重载函数参数类型不同参数个数不同参数顺序不同附加题1附加题22.3 c支持函数重载的原理预处理编译汇编连接总结要以一种很认真的态度去…

深度优先搜索(dfs)和广度优先搜索(bfs)

目录 一、前言 二、关于dfs和bfs有意思的小故事 三、深搜题例 1、小猫爬山链接 2、基本思路 3、代码 &#xff08;1&#xff09;python代码 四、广搜题例 1、武士风度的牛链接 2、基本思路 3、代码 &#xff08;1&#xff09;C代码 &#xff08;3&#xff09;pyth…

现在的编程语言越来越多,为什么 C 和 C++ 还没有被现在的时代淘汰呢?

C/C会不会被时代淘汰&#xff1f;这个问题跳过了一步&#xff0c;关键是这个问题&#xff1a; C/C有哪些其它语言难以代替的特殊之处&#xff1f; 1、对实现细节的控制粒度 一般我们常说&#xff1a;C/C具有较高的执行效率。其实这句话不是特别准确&#xff0c;有时候它们并…

npm报错整理

npm报错整理一、代理1. 因为使用公司的镜像源导致的403 forbidden总结一、代理 1. 因为使用公司的镜像源导致的403 forbidden 在更新脚手架的时候&#xff0c;遇到了403的报错&#xff1a; 遇到问题不要怕&#xff0c;我们根据错误去解决就好。 &#xff08;1&#xff09;首…

【黄啊码】MySQL入门—13、悲观锁、乐观锁怎么用?什么是行锁、页锁和表锁?死锁了咋办?

大家好&#xff01;我是黄啊码&#xff0c;MySQL的入门篇已经讲到第12个课程了&#xff0c;今天我们继续讲讲大白篇系列——数据库锁 目录 从数据库管理的角度对锁进行划分 共享锁也叫读锁或 S 锁 排它锁也叫独占锁、写锁或 X 锁。 意向锁&#xff08;Intent Lock&#xf…

C++库——windows下使用Qt5.15.2+mingw64+msys2编译c++数学库GSL

文章目录准备配置msys2编译GSL准备 下载gsl库的源代码。大家可以到GSL的官网下载gsl的源代码。目前版本为2.7&#xff0c;下载完成后解压缩。 下载msys2。msys2是一套在windows上运行的用于构建库和程序的工具库&#xff0c;下载地址可以使用清华源的下载地址。下载完成后&…

【论文解读】伪装物体检测 Camouflaged Object Detection

文章目录伪装物体检测 Camouflaged Object DetectionSINet v1RF模块&#xff1a;PDC模块&#xff1a;SINet v2特征提取Texture Enhanced Module 纹理增强模块Neighbor Connection Decoder 邻居连接解码器Group-Reversal Attention 组反转注意力总结伪装物体检测 Camouflaged Ob…

计算机毕业设计之java+javaweb的烯烃厂压力管道管理平台

项目介绍 系统权限按管理员和用户这两类涉及用户划分。 (a) 管理员&#xff1b;管理员使用本系统涉到的功能主要有&#xff1a;主页、个人中心、通知公告管理、用户管理、管道信息管理、单位信息管理、管道统计信息管理等功能。 (b) 用户登录进入系统可以对主页、个人中心、通…

2022高频经典前端面试题(html+css+js上篇,含答案)

博主经历过多轮面试&#xff0c;因此想将自己的面试经验以及答题技巧&#xff0c;分享给即将面试找前端工作的同学。 2022高频经典前端面试题分为上中下三篇&#xff0c;分别会有html,css,js,es6,vue,ts,nodejs,以及hr面和反问面试官几个维度去进行&#xff0c;完整的还原面试场…

在 Linux 中使用 tcp 转储命令来分析网络

前言 Tcpdump是用于分析网络和查找相关网络问题的出色工具。它会在数据包经过时捕获数据包&#xff0c;并向您显示网络上正在发生的事情和传入情况。该命令的输出显示在 STDOUT 上&#xff0c;也可以存储在文件中。 感谢开发人员&#xff0c;他们将Tcpdump保留为开源项目。它…

LinkedIn最好工具-领英精灵有哪些批量加好友方法?

领英工具-领英精灵有哪些批量加好友方法 使用领英的人都会使用领英精灵&#xff0c;因为领英精灵是目前本土做得最好的领英工具&#xff0c;具有很多强大的功能。特别是拓展人脉方面&#xff0c;提供了很多批量加好友的方法。刚使用的新手可能不知道如何操作&#xff0c;下面就…

施耐德电气“创新开放日”走进中国软件研发中心 以软件与创新驱动产业“双转型”

来源 | 施耐德电气 2022年10月27日&#xff0c;施耐德电气在位于北京亦庄的中国软件研发中心举办“创新开放日”&#xff0c;充分展示其在中国深化研发的战略布局。当天&#xff0c;施耐德电气展示了该中心成立一周年以来的创新研发成果&#xff0c;并与合作伙伴共话软件发展趋…

【jsdoc-to-markdown】一步步实现js文件的文档生成

文章目录导读开发环境安装Vs code插件&#xff1a;Doxygen Documentation Generator效果优势jsdoc-to-markdown的使用了解 jsdocjsdoc-to-markdown安装创建测试文件example.jsjsdoc-to-markdown使用jsdoc-to-markdown踩坑&#xff01;&#xff01;&#xff01;参考资料导读 这个…

【C++】一文带你吃透string的模拟实现 (万字详解)

&#x1f308;欢迎来到C专栏~~ 模拟实现string (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort&#x1f393;&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&#x1f914;&#…

生态流量智能终端机 水电站生态流量多媒体智能终端-视频叠加、数据采集、远程传输

平升电子生态流量智能终端机 水电站生态流量多媒体智能终端是一款集人机交互、视频叠加、4G路由、数据采集、逻辑运算与远程传输功能于一体的多媒体智能终端设备。 此款产品为水电站生态流量监测项目的专用产品&#xff0c;便于监管单位及时掌握水电站的流量下泄情况&#xff…

【Django框架】——19 Django视图 01 路由配置

文章目录一、视图介绍二、路由配置1. 配置URLconf2.编辑项目中urls.py&#xff08;根路由&#xff09;3.创建应用中 urls.py (子路路由)4.路由文件urls.py5.API讲解一、视图介绍 视图就是应⽤用中views.py⽂文件中的函数 视图的第⼀个参数必须为HttpRequest对象&#xff0c;还…

计算多张图片的移位距离

( A, B )---25*30*2---( 1, 0 )( 0, 1 ) 做一个二分类的网络分类A和B&#xff0c;让A和B的训练集中都有多张图片&#xff0c;用一种平均值的办法把多张图片等效成两张图片&#xff0c;统计两张图片的移位距离&#xff0c;并比较移位距离和迭代次数的关系。 设AB训练集都只有两…

Python编程 赋值,逻辑,位运算符

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.赋值运算符 1.基本赋值运算符 2.注意 二.逻辑运算符 1.逻辑运算符使…

【LeetCode】No.70. Climbing Stairs -- Java Version

题目链接&#xff1a;https://leetcode.com/problems/climbing-stairs/ 1. 题目介绍&#xff08;Climbing Stairs&#xff09; You are climbing a staircase. It takes n steps to reach the top. 【Translate】&#xff1a; 你正在爬楼梯&#xff0c;爬到山顶要走n步。 Each…

最受欢迎的职业榜单!医生还是程序员?

最受欢迎的男友职业排行榜终于更新了&#xff0c;医生荣归榜首成为了第一名。 出人意外的是&#xff0c;公务员竟然只排名第六。 榜单上可以看出程序员也霸榜&#xff0c;占据了排行前三的位置。 程序员相对于医生有什么样的优势呢&#xff1f; 首先是逻辑分析能力。 虽然医生…