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;这个赋值语句是非法的,不能将常量赋给常量,也就是说等号左边必须是变量才能赋值

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 知识点

自定义导航 在page.json navigationstyle":"custom"navigateTo传参 页面传参只能onLoad(option)里面拿 px和upx的关系 在750设计图中&#xff0c;1px1upx 路由 navigateBack返回上一页 重定向 其实就是把当前页面干掉了 公共组件和页面共同点 computed,watc…

vue初学随笔

Vue基础 Vue基本概念 Vue是什么 Vue是一个渐进式的JavaScript框架&#xff0c;它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。 渐进式&#xff1a;各个特性可以根据项目需要逐渐引入和…

认知杂谈84《菜鸟的自我修炼:知易行难与行难知易》

内容摘要&#xff1a; 理解与行动之间的差距是日常生活的常见挑战。"知易行难"体现在理解简单但执行困难&#xff0c;例如知道蔬菜有益但难以坚持食用。而"行难知易"则是开始时困难但后来容易的任务&#xff0c;如学习骑自行车。 这种差异源于心理惰性和习…

Oracle RMAN 无敌备份脚本

1 说明 上一篇文章&#xff1a;Oracle逻辑备份脚本&#xff0c;介绍了如何部署Oracle数据库的逻辑备份脚本&#xff0c;在数据迁移场景下十分好用&#xff0c;但是作为备份来说有点牵强。仅仅有逻辑备份时&#xff0c;当故障发生后&#xff0c;逻辑备份恢复只能恢复到某一时刻…

OpenHarmony(鸿蒙南向)——平台驱动指南【MIPI CSI】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 CSI&#xff08;Camera Serial Interface&#xf…

JavaScript 学习

一、输出 为方便调试可以输出内容&#xff0c;但是用户是看不到的。要在开发者模式中看。 console . log ( "Hello" )&#xff1b; 二、外部文件引用 可以直接在html中写JS <head> <meta charset"utf-8"> <script> console.log("he…

Java面试题之JVM20问

1、说说 JVM 内存区域 这张图就是一个 JVM 运行时数据图&#xff0c;「紫色区域代表是线程共享的区域」&#xff0c;JAVA 程序在运行的过程中会把他管理的内存划分为若干个不同的数据区域&#xff0c;「每一块儿的数据区域所负责的功能都是不同的&#xff0c;他们也有不同的创建…

MAGICORE:基于多代理迭代的粗到细精炼框架,提升大语言模型推理质量

大语言模型(LLM)的推理能力可以通过测试时聚合策略来改进,即为每个问题生成多个样本并对它们进行聚合以找到更好的答案。这些方法往往会达到饱和点,超过这个点后额外的样本不会带来更多收益。精炼(refinement)提供了另一种选择,它使用模型生成的反馈不仅采样更多解决方案,还提高…

使用离火插件yoloV8数据标注,模型训练

1. 启动 2.相关配置 2.1 data.yaml path: D:/yolo-tool/yaunshen-yolov8/YOLOv8ys/YOLOv8-CUDA10.2/1/datasets/ceshi001 train: images val: images names: [蔡徐坤,篮球] 2.2 cfg.yaml # Ultralytics YOLOv8, GPL-3.0 license # Default training settings and hyp…

解读 Story Protocol:IP 与区块链的潜力与障碍

撰文&#xff1a;100y.eth 编译&#xff1a;J1N&#xff0c;Techub News 8 月&#xff0c;据 The Block 报道&#xff0c;专注于知识产权&#xff08;IP&#xff09;的区块链 Story 宣布完成 a16z Crypto 领投 8000 万美元 B 轮融资&#xff0c;参投方包括 Polychain Capital&…

AI搜索软件哪个好,AI搜索引擎工具分享

随着AI技术的发展&#xff0c;AI搜索引擎工具正逐渐成为我们信息获取的重要方法。下面小编就来和大家分享一些好用的AI搜索引擎软件&#xff0c;感兴趣的同学可以逐个使用体验一下。因为每个AI搜索引擎工具不同&#xff0c;建议大家搜索的时候可以多个工具搜索&#xff0c;然后…

Java笔试面试题AI答之设计模式(1)

文章目录 1. 简述什么是设计模式 &#xff1f;2. 叙述常见Java设计模式分类 &#xff1f;3. Java 设计模式的六大原则 &#xff1f;4. 简述对 MVC 的理解&#xff0c; MVC 有什么优缺点&#xff1f;MVC 的三个核心部分&#xff1a;MVC 的优点&#xff1a;MVC 的缺点&#xff1a…

已存在的Python项目使用依赖管理工具UV

1. 文档 uv文档 2. 如何转换 初始化 uv initrequirements.txt转换成pyproject.toml uv add $(cat requirements.txt)删除requirements.txt 如果更新pyproject.toml之后&#xff0c;使用命令 uv sync替换项目环境 如果有库没有加入依赖&#xff0c;自己手动加一下&am…

助力降本增效,ByteHouse打造新一代云原生数据仓库

随着数据量的爆炸式增长、企业上云速度加快以及数据实时性需求加强&#xff0c;云原生数仓市场迎来了快速发展机遇。 据 IDC、Gartner 研究机构数据显示&#xff0c;到 2025 年&#xff0c;企业 50% 数据预计为云存储&#xff0c;75% 数据库都将运行在云上&#xff0c;全球数据…

【Kubernetes】日志平台EFK+Logstash+Kafka【实战】

一&#xff0c;环境准备 &#xff08;1&#xff09;下载镜像包&#xff08;共3个&#xff09;&#xff1a; elasticsearch-7-12-1.tar.gz fluentd-containerd.tar.gz kibana-7-12-1.tar.gz &#xff08;2&#xff09;在node节点导入镜像&#xff1a; ctr -nk8s.io images i…

webpack使用

一、简介 概述 本次使用webpack4进行构建打包 二、webpack 安装webpack、webpack-cli npm install webpack4.2.0 webpack-cli4.2.0 -D 三、loader 加载器概述 raw-loader&#xff1a;加载文件原始内容&#xff08;utf-8&#xff09; file-loader&#xff1a;把文件输出…

CentOS 7 中安装 docker 环境

作者&#xff1a;程序那点事儿 日期&#xff1a;2023/02/15 02:31 官网地址 官网文档 docker三种网络模式 Docker CE 支持 64 位版本 CentOS 7&#xff0c;并且要求内核版本不低于 3.10&#xff0c; CentOS 7 满足最低内核的要求。 Docker 分为 CE 和 EE 两大版本。CE 即社区…

蓝桥杯1.小蓝的漆房

样例输入 2 5 2 1 1 2 2 1 6 2 1 2 2 3 3 3样例输出 1 2 import math import os import sys tint(input())#执行的次数 for j in range(t):n,kmap(int,input().split())#n为房间数 k为一次能涂的个数alist(map(int,input().split()))#以列表的形式存放房间的颜色maxvaluemath…

81、Python之鸭子类型:从魔法函数看对象的字符串呈现

引言 前面已经介绍了鸭子类型的概念&#xff0c;以及Python中支撑鸭子类型理念的“魔法函数”的体系。Python中的魔法函数分为几大类&#xff0c;本文我们首先从最简单的自定义类型的字符串呈现来切入&#xff0c;逐步理解并掌握Python中的魔法函数的完整架构。 本文的主要内…

玩转指针(3)

一、字符指针变量 字符指针变量&#xff08;如char* p&#xff09;的两种赋值方式 ①将字符类型地址赋值给字符指针变量 int main() {char a w;char* p &a;*p m;return 0; }②将常量字符串赋值给字符指针变量 常量字符串的介绍&#xff1a;用" "引起来的就…