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 的值都会增加,并且其值在函数调用之间保持不变。

五、

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

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

相关文章

中电信翼康基于Apache Dolphinscheduler重构“星海·济世医疗数据中台”实践经验分享

文章作者&#xff1a;尚志忠 编辑整理&#xff1a;曾辉 行业背景 随着大数据、云计算、5G、人工智能等技术的快速发展&#xff0c;以及医疗信息化建设的不断深入&#xff0c;数据中台作为打通医疗数据融合壁垒、实现数据互通与共享、构建高效数据应用的关键信息平台&#xf…

松材线虫目标检测数据集,12522张图-纯手工标注

松材线虫目标检测数据集&#xff0c;12522张图像&#xff0c;专家纯手工标注。 松材线虫目标检测数据集 数据集描述 该数据集是一个专门用于松材线虫&#xff08;Bursaphelenchus xylophilus&#xff09;检测的数据集&#xff0c;旨在帮助研究人员和开发者训练和评估基于深度…

Python 操作 Arduino 入门

本文翻译整理自&#xff1a;Arduino With Python: How to Get Started https://realpython.com/arduino-python/ 文章目录 一、Arduino平台1、Arduino硬件2、Arduino软件 二、“Hello, World!”与Arduino1、上传眨眼示例草图2、连接外部组件3、使用面包板 三、“Hello, World!”…

技术美术百人计划 | 《5.1.1 PBR-基于物理的材质》笔记

1. PBR定义-基于物理的材质 PBR&#xff0c;或者用更通俗一些的称呼是指基于物理的渲染(Physically Based Rendering)&#xff0c;它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。 正因为基于物理的渲染目的便是为了使用一种更…

利用Metasploit进行信息收集与扫描

Metasploit之信息收集和扫描 在本文中&#xff0c;我们将学习以下内容 使用Metasploit被动收集信息 使用Metasploit主动收集信息 使用Nmap进行端口扫描 使用db_nmap方式进行端口扫描 使用ARP进行主机发现 UDP服务探测 SMB扫描和枚举 SSH版本扫描 FTP扫描 SMTP枚举 …

关于机器学习和深度学习的区别有哪些?

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于机器学习和深度学习区别的相关内容&…

Jboss CVE-2017-7504 靶场攻略

漏洞介绍 JBoss AS 4.x及之前版本中&#xff0c;JbossMQ实现过程的JMS over HTTP Invocation Layer的 HTTPServerILServlet.java⽂件存在反序列化漏洞&#xff0c;远程攻击者可借助特制的序列化数据利⽤该漏洞执⾏ 任意代码执⾏ 影响范围 JBoss 4.x 以及之前的所有版本 环…

对接阿里asr和Azure asr

1&#xff1a;对接阿里asr 1.1&#xff1a;pom <dependency><groupId>com.alibaba.nls</groupId><artifactId>nls-sdk-recognizer</artifactId><version>2.2.1</version> </dependency>1.2&#xff1a;生成token package c…

Springboot 文件上传下载相关问题

文章目录 关于Springboot 文件上传下载问题解决方案注意事项文件上传文件下载文件删除文件在线打开在写练习的时候&#xff0c;发现了一些小小的问题&#xff0c;已经在 上述代码中体现。① 代码路径碰到中文的时候&#xff0c;会有乱码&#xff0c;需要转换&#xff08;内容中…

fanuc添加地轨步骤图

机器人选项J518 法兰盘选择 FLANGE TYPE SELECT1 一般 机器人类型选择 TYPE SETTING2 J1运动范围设置 机器人->控制启动

鸿蒙开发的基本技术栈及学习路线

随着智能终端设备的不断普及与技术的进步&#xff0c;华为推出的鸿蒙操作系统&#xff08;HarmonyOS&#xff09;迅速引起了全球的关注。作为一个面向多种设备的分布式操作系统&#xff0c;鸿蒙不仅支持手机、平板、智能穿戴设备等&#xff0c;还支持IoT&#xff08;物联网&…

Java 每日一刊(第13期):this super static

“优秀的代码不仅仅是给机器看的&#xff0c;更是给人看的。” 前言 这里是分享 Java 相关内容的专刊&#xff0c;每日一更。 本期将为大家带来以下内容&#xff1a; this 关键字super 关键字static 关键字 this 关键字 this 关键字是 Java 中最常见的关键字之一&#xf…

科技赋能安全,财谷通助力抖音小店腾飞!

在数字经济的浪潮中&#xff0c;短视频与直播带货已成为新时代的商业风口&#xff0c;抖音小店作为这一领域的佼佼者&#xff0c;正引领着无数小微商家踏上创业与转型的快车道。然而&#xff0c;随着市场的日益繁荣&#xff0c;如何有效管理店铺、提升运营效率、保障交易安全成…

Hadoop-MapReduce的 原理 | 块和片 | Shuffle 过程 | Combiner

MapReduce的原理 简单版本&#xff1a; AppMaster: 整个Job任务的核心协调工具 MapTask: 主要用于Map任务的执行 ReduceTask: 主要用于Reduce任务的执行 一个任务提交Job --> AppMaster(项目经理)--> 根据切片的数量统计出需要多少个MapTask任务 --> 向ResourceMan…

伊犁-linux root 密码忘记咋办

1 root 密码忘记了 或者reboot 重启之后在引导界面 按住 e 进入如下界面 然后按住ctrlx 进入这个界面 root 修改成功

【机器学习(九)】分类和回归任务-多层感知机 (MLP) -Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09;感知机&#xff08;二&#xff09;多层感知机1、隐藏层2、激活函数sigma函数tanh函数ReLU函数 3、反向传播算法 三、算法优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 四、MLP分类任务实现…

Hive企业级调优[3]—— Explain 查看执行计划

Explain 查看执行计划 Explain 执行计划概述 EXPLAIN 命令呈现的执行计划由一系列 Stage 组成。这些 Stage 之间存在依赖关系&#xff0c;每一个 Stage 可能对应一个 MapReduce Job 或者一个文件系统的操作等。如果某 Stage 对应了一个 MapReduce Job&#xff0c;则该 Job 在 …

机器翻译之Bahdanau注意力机制在Seq2Seq中的应用

目录 1.创建 添加了Bahdanau的decoder 2. 训练 3.定义评估函数BLEU 4.预测 5.知识点个人理解 1.创建 添加了Bahdanau的decoder import torch from torch import nn import dltools#定义注意力解码器基类 class AttentionDecoder(dltools.Decoder): #继承dltools.Decoder写…

动手学深度学习(五)循环神经网络RNN

一、序列模型 1、统计工具 ①联合概率分布 假设有一个序列 x[x1,x2,…,xT]&#xff0c;我们可以把序列的联合概率分解为多个条件概率的乘积。 ②建模 f(x1​,…,xt−1​) 是一个函数&#xff0c;用于提取前 t−1个序列元素的信息。这意味着我们不需要存储每一个之前的序列元…

关于群里脱敏系统的讨论2024-09-20

群里大家讨论脱敏系统&#xff0c;傅同学&#xff1a;秦老师&#xff0c;银行数据脱敏怎么做的&#xff0c;怎么存储的&#xff1f; 采购了脱敏系统&#xff0c;一般是硬件&#xff08;厂商直接卖的一体机&#xff09;。这个系统很复杂&#xff0c;大概卖50-100万一台。 最核…