当前位置: 首页 > news >正文

C语言中的一些小知识(三)

一、你了解printf()吗?

你知道下面代码的输出结果吗?

int a=123;
printf("%2d \n",a);

printf() 函数是 C 语言中用于格式化输出的标准函数,它允许你将数据以特定的格式输出到标准输出设备(通常是屏幕)。printf() 函数定义在 <stdio.h> 头文件中。它的基本语法如下:

#include <stdio.h>int main() {// 输出字符串printf("Hello, World!\n");// 输出整数int num = 10;printf("The number is: %d\n", num);// 输出浮点数double pi = 3.14159;printf("Pi is: %.2f\n", pi);//.2指的是保留小数点后两位小数// 输出字符char ch = 'A';printf("The character is: %c\n", ch);// 输出多个变量int a = 5;float b = 2.5;printf("a = %d, b = %f\n", a, b);// 输出宽度和精度printf("Width 5, precision 2: %5.2f\n", pi);//5指的是输出的字符串字宽为五,默认输出结果靠右// 输出十六进制int hex = 255;printf("Hexadecimal: %x\n", hex);// 输出八进制int oct = 255;printf("Octal: %o\n", oct);// 输出指针int val = 10;int *ptr = &val;printf("Value: %d, Address: %p\n", val, (void*)ptr);// 输出长整型long l = 1234567890;printf("Long integer: %ld\n", l);// 输出无符号整数unsigned int u = 4294967295;printf("Unsigned int: %u\n", u);// 输出长双精度浮点数long double ld = 123456789.0123456789L;printf("Long double: %Lf\n", ld);return 0;
}
Hello, World!
The number is: 10
Pi is: 3.14
The character is: A
a = 5, b = 2.500000
Width 5, precision 2:  3.14
Hexadecimal: ff
Octal: 377
Value: 10, Address: 00F3F8CC
Long integer: 1234567890
Unsigned int: 4294967295
Long double: 123456789.012346
请按任意键继续. . .

对于开始的题目,你是否有自己想法了呢?下面就让我们用一段C程序验证一下吧!

#include <stdio.h>int main() {int a=123;printf("%2d \n",a);return 0;
}

输出结果如下:

123

 你是不是又有了自己的判断那我再考你一个,如果不确定就自己动手试一下吧!

double a=123.123;
printf("%2f\n",a);

二、你知道常量指针吗?

看看下面这个C程序,输出结果是啥?

#include <stdio.h>int main() {char s[]="asdf";s+=2;printf("%d\n",s[0]);return 0;
}
#include <stdio.h>int main() {char *s="asdf";s += 2;  // s 现在指向 'd'printf("%c\n", s[0]);  // 打印 'd'return 0;
}
#include <stdio.h>int main() {char *s="asdf";printf("%c\n", s);  // 打印 'd'return 0;
}

三、 认识gets()函数、了解输入流

通过下面的程序我们了解一下啊gets()的用法和字符串流入计算机的方式

#include <stdio.h>int main() {char a[20],b[]="The sky blue.";int i;for(i=0;i<7;i++)scanf("%c",&b[i]);gets(a);printf("%s%s\n",a,b);return 0;
}

运行程序后我们在键盘上输入fig flower is red.<回车>,程序通过for(i=0;i<7;i++; scanf("%c",&b[i]);b[]就获取到前七个字符"fig flo",新获取的字符将会原字符覆盖掉,通过gets(a),就将剩余部分的数据放入到了a[20]中。

fig flower is red.
wer is red.fig flo blue.
请按任意键继续. . .

下面我们来介绍一下get()函数:

gets() 函数是 C 语言标准库中的一个函数,用于从标准输入(通常是键盘)读取一行文本。然而,gets() 函数在 C11 标准中已经被废弃了,因为它是不安全的,容易导致缓冲区溢出的安全问题。

尽管如此,了解 gets() 函数的用法对于学习历史和理解为什么它被废弃是有帮助的。以下是 gets() 函数的基本用法:

函数原型

char *gets(char *str);

参数

  • str:指向字符数组的指针,用于存储输入的字符串。

返回值

  • 成功时返回 str 指向的字符串。
  • 失败时返回 NULL

用法示例

#include <stdio.h>int main() {char buffer[100];printf("Enter a line of text: ");gets(buffer);  // 读取一行文本printf("You entered: %s\n", buffer);return 0;
}

在这个示例中,我们定义了一个字符数组 buffer 来存储用户输入的文本。使用 gets() 函数读取一行文本,并将其存储在 buffer 中。然后,我们打印出用户输入的文本。

安全问题

gets() 函数不检查目标缓冲区的大小,因此如果用户输入的文本超过了缓冲区的大小,就会导致缓冲区溢出,可能会覆盖内存中的其他数据,导致程序崩溃或安全漏洞。

替代方案

由于 gets() 函数的不安全性,推荐使用 fgets() 函数作为替代。fgets() 函数允许指定缓冲区的大小,从而避免缓冲区溢出的问题。

#include <stdio.h>
#include <string.h>
int main() {char buffer[100];printf("Enter a line of text: ");fgets(buffer, sizeof(buffer), stdin);  // 读取一行文本// 去除可能读取的换行符buffer[strcspn(buffer, "\n")] = 0;printf("You entered: %s\n", buffer);return 0;
}
Enter a line of text: efgortuvhasqtvabn;lr uhgoei3pr ghjupw;aoe9irjufg [o0e3;r4i9ghjvnaw;o0i38er4ghjnva['pw-io94jfr['apiorw490e3ghjnieokrpjgmerpighjeoi8gvhjnfgv/vao;'iw34ift0rwgh4we0r tjug3[-]9tfjuwpr4gihqao9iu hjf9-[4ujfwp'-gtju53igtyhn038wqjfhrm 0[ mfju49 gt0yh58cm [t50y8 g9etcm[0 0cmu c9t ,u,tgyhuh0 r8egotyv89 ghgr oio
You entered: efgortuvhasqtvabn;lr uhgoei3pr ghjupw;aoe9irjufg [o0e3;r4i9ghjvnaw;o0i38er4ghjnva['pw-io94jfr['apio
请按任意键继续. . .

在这个替代示例中,我们使用 fgets() 函数读取一行文本,并指定缓冲区的大小。这样可以确保不会超出缓冲区的范围,从而提高程序的安全性。

总之,虽然了解 gets() 函数的用法是有益的,但在实际编程中应该避免使用它,而是使用更安全的 fgets() 函数。

四、静态变量?

大家看一看下面这一行程序,有没有觉得运行结果应该是4,7,10,13,的,有没有怀疑过自己的静态变量的知识点记错了。

这里一定要看清n=0;这一个语句。

#include <stdio.h>
int a=2;
int f(int m){static int n;n=0;n++;a++;return n+m+a;
}
int main() {int k;for(k=0;k<4;k++)printf("%d,",f(k));return 0;
}
4,6,8,10,请按任意键继续. . .

在C语言中,静态变量(static variable)是一种特殊的变量存储类别,它具有持久的存储期,这意味着静态变量的值在函数调用之间是持久的。静态变量的用途和特性如下:

1. 持久性

静态变量在程序的整个运行期间都存在,它们的值在函数调用之间不会消失。这与自动变量(如局部变量)不同,后者在函数调用结束后其值会丢失。

2. 初始化

静态变量在程序开始运行时初始化一次,如果未显式初始化,则默认为0。一旦初始化,它们的值在后续的函数调用中会保留,除非显式地修改它们。

3. 作用域

静态变量的作用域通常与定义它们的函数或文件相同。如果静态变量在函数内部定义,则它只能在该函数内部访问。如果它在函数外部定义,则在整个文件中都可以访问。

4. 链接性

静态变量的链接性可以是内部的(static 关键字)或外部的(默认)。具有内部链接性的静态变量只能在定义它们的文件中访问,而具有外部链接性的静态变量可以在其他文件中通过声明为 extern 来访问。

5. 使用场景

  • 函数内部:在函数内部定义静态变量通常用于跟踪函数调用的次数或维持函数的状态。
  • 全局变量:作为全局变量定义时,它们在整个程序中是可见的,但只能在定义它们的文件中访问,除非通过 extern 关键字在其他文件中声明。

示例代码

#include <stdio.h>void count_calls() {static int count = 0;  // 静态变量,用于计数函数调用次数printf("This function has been called %d times.\n", ++count);
}int main() {count_calls();  // 输出: This function has been called 1 times.count_calls();  // 输出: This function has been called 2 times.count_calls();  // 输出: This function has been called 3 times.return 0;
}
This function has been called 1 times.
This function has been called 2 times.
This function has been called 3 times.
请按任意键继续. . .

在这个例子中,count_calls 函数中的 count 变量是一个静态变量,它用于跟踪函数被调用的次数。每次调用函数时,count 的值都会增加,并且其值在函数调用之间保持不变。

五、你真的认识赋值符号“=”吗?

int a,b,c=4;
a=(b=4)=c;

a=(b=4)=c;这个赋值语句是非法的,不能将常量赋给常量,也就是说等号左边必须是变量才能赋值

相关文章:

C语言中的一些小知识(三)

一、你了解printf()吗&#xff1f; 你知道下面代码的输出结果吗&#xff1f; int a123; printf("%2d \n",a); printf() 函数是 C 语言中用于格式化输出的标准函数&#xff0c;它允许你将数据以特定的格式输出到标准输出设备&#xff08;通常是屏幕&#xff09;。p…...

编译win2k3中tools目录下i386mk.inc文件的作用

编译win2k3中tools目录下i386mk.inc文件的作用 在Windows Driver Kit&#xff08;WDK&#xff09;的根安装目录下&#xff0c;这些文件存储在bin子目录中。 在这些文件中&#xff0c;有特定于该目标的优化规则或汇编指令。可能还需要额外的链接标志、资源编译器标志或C预处理器…...

IPSec隧道协议学习(一)

前情回顾 前面介绍的GRE隧道协议&#xff0c;可以字LAN之间通过Internet建立隧道&#xff0c;实现网络间资源共享&#xff0c;但是GRE隧道协议不能实现加密功能&#xff0c;传输的数据不受加密保护&#xff0c;为了实现在隧道间传输数据包收到加密保护&#xff0c;需要使用IPS…...

计网作业3

1.交换机是依据 MAC地址 来转发数据包的 2.数据链路层 负责将数据封装成帧&#xff0c;在相邻节点间进行传输 数据链路层负责以下任务&#xff1a; 封装数据 物理地址寻址&#xff1a;使用MAC地址进行寻址&#xff0c;确保数据能够在局域网中正确传输到目标节点 介质访问控…...

什么是注入攻击???

在 Java 中&#xff0c;注入攻击是一种利用程序中的安全漏洞来执行恶意代码或获取未经授权的数据的攻击方式。 相关面试题&#xff1a; #{} 和 ${} 的区别是什么&#xff1f; ${}是 Properties 文件中的变量占位符&#xff0c;它可以用于标签属性值和 sql 内部&#xff0c;属…...

牛客小白月赛101(A~E)

文章目录 写在前面A tb的区间问题思路code B tb的字符串问题思路code C tb的路径问题思路code D tb的平方问题思路code E tb的数数问题思路code 牛客小白月赛101 写在前面 最近几天没怎么刷题&#xff0c;昨天晚上打的这场牛客月赛打的很烂&#xff0c;隔几天不刷题感觉自己的…...

MFC设置特定控件字体大小和背景颜色

MFC设置特定控件字体大小和背景颜色 初始化函数里 m_editFont.CreatePointFont(580 , _T("宋体"));m_ctrlEdit.SetFont(&m_editFont);重写消息 HBRUSH CMFCTESTDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {HBRUSH hbr CDialogEx::OnCtlColor(pDC,…...

专题八_链表_算法专题详细总结

目录 链表 1.常用技巧 1&#xff09;画图&#xff01;&#xff01;&#xff01; -> 直观 形象 便于我们理解 2&#xff09;引入虚拟“头”节点 1.便于处理边界条件 2.方便我们对链表进行操作 3.不要吝啬空间&#xff0c;大胆定义变量 4.快慢双指针 1.判断链表是否…...

Vue3使用vue-quill富文本编辑器实现图片大小调整

安装uill-image-resize npm install quill-image-resize --save在项目中导入并注册插件 import { QuillEditor, Quill } from vueup/vue-quill; import ImageUploader from quill-image-uploader; import ImageResize from quill-image-resize; //导入插件 import vueup/vue-…...

感知笔记1:ROS 视觉- 跟随红球

- 目录 - 如何在 ROS 中可视化 RGB 相机。如何作为机器人切换主题。如何创建 blob 检测器。如何获取要跟踪的颜色的颜色编码。如何使用 blob 检测数据并移动 RGB 相机以跟踪 blob。 机器人技术中最常见的传感器是不起眼的 RGB 摄像头。它用于从基本颜色跟踪&#xff08;blob 跟…...

JAVA多线程机制

JAVA多线程的实现 JAVA有两种方法创建线程 &#xff08;1&#xff09;继承Thread类 &#xff08;2&#xff09;实现Runnable接口 这两种方法都要用到Thread类以及相关方法 Thread类 是一个具体的类&#xff0c;不是抽象类&#xff0c;封装了线程的行为 利用Thread类创建一个…...

Element-plus安装及其基础组件使用

简而言之&#xff0c;在main.js中导出以下库,仅此&#xff0c;搞多了出错难排查 import ElementPlus from element-plus //导入ElementPlus 模块 import element-plus/dist/index.css //引入样式 app.use(ElementPlus) //注册库就能使用了 Element Plus 是一个基于 Vue 3 的组件…...

[产品管理-38]:创意、市场机会、商业可行性的区别

创意、市场机会和商业可行性在创业和商业活动中各自扮演着不同的角色&#xff0c;它们之间既有区别又相互联系。以下是对这三者区别的详细阐述&#xff1a; 产品创意&#xff1a;新颖打破常规、解决的实际问题、满足的客户需求 定义&#xff1a;创意是创造意识或创新意识的简…...

开源标注工具

DoTAT https://github.com/FXLP/MarkTool 后端代码未开放&#xff0c;可能有数据泄露风险 Chinese-Annotator https://github.com/deepwel/Chinese-Annotator 安装非常麻烦&#xff0c;github更新频率比较低&#xff0c;支持功能和doccano类似 IEPY https://github.com/ma…...

数据结构讲解二叉树 【一】

&#x1f381;&#x1f381;创作不易&#xff0c;关注作者不迷路&#x1f380;&#x1f380; C语言二叉树 【一】 前言一、数概念及结构1.数的概念1.2树的相关概念1.3树的表示 二、二叉树的概念及结构2.12.2二叉树的性质2.3二叉树的存储结构 三、二叉树的顺序结构实现3.1二叉树…...

MATLAB基础应用精讲-【数模应用】OR值

目录 前言 几个高频面试题目 or值越小代表什么 RR值、OR值及HR值的区别 算法原理 什么是OR值 OR值的计算方法和含义 注意事项 SPSSAU OR值和RR值 1、背景 2、理论 3、操作 4、SPSSAU 输出结果 5、文字分析 6、剖析 疑难解惑 SE(ln(OR)或SE(ln(RR)的意义? …...

[vulnhub] w1r3s.v1.0

https://www.vulnhub.com/entry/w1r3s-101,220/ 思路&#xff1a;红队笔记 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是133 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-20 09:09 CST…...

c#中的功能优势

装箱和拆箱 性能消耗的直接体现 int iterations 10000000; // 进行一千万次迭代Stopwatch stopwatch new Stopwatch();// 非装箱测试stopwatch.Start();for (int i 0; i < iterations; i){int x i; // 纯值类型操作&#xff0c;无装箱}stopwatch.Stop();Console.Writ…...

Windows系统设置定时任务,周期性执行.bat文件

通过.bat清除注册表项 在 Windows 系统中&#xff0c;.bat 文件&#xff08;批处理文件&#xff09;是一个包含一系列命令的文本文件。这些命令会被 Windows 命令解释器 (cmd.exe) 依次执行。 你可以把它想象成一个简单的程序&#xff0c;但它不像 C 或 Python 那样需要编译&a…...

xQTLs 共定位分析(XQTLbiolinks包)

XQTL 共定位分析 XQTLbiolinks 是一个端到端的生物信息学工具&#xff0c;由深圳湾实验室李磊研究团队开发&#xff0c;用于高效地分析公共或用户定制的个xQTLs数据。该软件提供了一个通过与 xQTLs 共定位分析进行疾病靶基因发现的流程&#xff0c;以检测易感基因和致病变异。…...

网络工程(学习记录)

day1创建Vlan Switch>enable Switch#configure terminal Switch(config)#hostname SW1 修改名称为SW1 SW1(config)# SW1(config)#vlan 10 创建vlan10 SW1(config-vlan)#vlan 20 SW1(config)#interface f0/1 进入接口f0…...

全志A133 android10 适配EC20 4G模块

一&#xff0c;移植适配 1. 驱动移植 代码路径&#xff1a;longan/kernel/linux-4.9/drivers/usb/serial/option.c diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 9f96dd2..2f25466 100644 --- a/drivers/usb/serial/option.cb/drivers/us…...

数据分析:Python语言网络图绘制

文章目录 介绍加载R包类别导入数据下载数据画图介绍 网络图是一种图形表示法,用于展示实体之间的关系。在不同的领域中,网络图有着不同的含义和用途:在生物学中,网络图可以用来表示生物分子之间的相互作用,如蛋白质相互作用网络。 加载R包 import pandas as pd import …...

使用ChatGPT引导批判性思维,提升论文的逻辑与说服力的全过程

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 批判性分析&#xff08;Critical Analysis&#xff09; 是论文写作中提升质量和说服力的重要工具。它不仅帮助作者深入理解和评价已有研究&#xff0c;还能指导作者在构建自己论点时更加…...

vue限定类型上传文件 最简单实践(单个可文件、可图片)

这个是为了文件导入弄的&#xff0c;内部运维人员使用的 目前还没做删除文件的交互 <el-uploadclass"upload-demo"ref"upload":before-upload"handleBeforeUpload"action"#"accept".xls,.xlsx":limit"1">&l…...

【GUI设计】基于图像分割和边缘算法的GUI系统(7),matlab实现

博主简介&#xff1a; 如需获取设计的完整源代码或者有matlab图像代码项目需求/合作&#xff0c;可联系主页个人简介提供的联系方式或者文末的二维码。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于图像分割和边缘算法的GUI系统…...

未来之窗VOS编程工具让你的工作效率翻倍———未来之窗行业应用跨平台架构

未来之窗编程工具概述 平板电脑/手机用于编程具有诸多优点。其便携性强&#xff0c;方便随时随地开展工作。触摸操作直观便捷&#xff0c;长续航能满足长时间需求&#xff0c;启动迅速。支持手写绘图&#xff0c;利于表达想法。能集成多种编程工具&#xff0c;还便于通过云服务…...

分布式数据库——HBase基本操作

启动HBase: 1.启动hadoop,进入hadoop的sbin中 cd /opt/hadoop/sbin/ 2.初始化namenode hdfs namenode -format 3.启动hdfs ./start-all.sh 4.启动hbase cd /opt/hbase/bin ./start-hbase.sh 5.使用jps查看进程 jps 以下图片则是hbase启动成功~ 运行HBase ./hbase sh…...

Go语言并发编程中的超时与取消机制解析

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 并发编程是Go语言的核心优势之一,而在实际应用中,超时和取消操作会频繁出现。超时机制能够帮助我们理解系统行为,防止系统因为某些任务执行过长而陷入困境。与此同时,取消操作则是应对超时的一种自然反应。此…...

Unity3D UIdocument如何改变层级详解

前言 在Unity3D中&#xff0c;UI文档的层级改变通常涉及UI元素的显示顺序&#xff0c;这是通过UGUI&#xff08;Unitys Graphical User Interface&#xff09;系统来实现的。以下是一篇关于如何在Unity3D中改变UI元素层级的详细解析&#xff0c;包括技术详解和代码实现。 对惹…...