C语言中的变量与scanf介绍(干货)

目录

前言

一、变量

1. 变量的创建

2. 变量的分类

3. 强制类型转换

二、scanf介绍

1. scanf的基本用法

2. scanf的返回值

3. scanf的占位符

4. 赋值忽略符

结语:


前言

我们在前面的文章中介绍了数据类型,以及printf函数的使用。

C语言中的数据类型-CSDN博客

printf函数讲解,转义字符与占位符-CSDN博客

在介绍数据类型时,并没有描述它的具体作用,其实数据类型的作用就是创建变量。

那么什么是变量呢?我们接下来介绍。

一、变量

C语言中把经常变化的值称为变量,不变的值称为常量。

1. 变量的创建

变量的创建形式是这样的:

571bbc2f47d34f19bb561e8f79a5d09b.png

数据类型在前,变量名在后。

我们可以看到图片上的变量名下方有一个小灰点,这是因为我们虽然创建了变量,但是没有给变量赋予初始的值。

那么,我们可以在创建变量后给变量赋予一个值,或是在创建的时候就给一个初始值,前者叫做赋值,后者叫做初始化。

81ca532c4428423c8770c10b765e0094.png

5a4378a8ca334a87ae0a7e9ebbce09ee.png

当然,我们在创建变量的时候还需要注意命名:

  1. 变量名必须以字母或下划线开头。
  2. 变量名可以包含字母、数字和下划线。
  3. 变量名不允许使用特殊字符(如空格、$、%等)。
  4. 变量名区分大小写(例如,myVariable和MyVariable是两个不同的变量)。
  5. 变量名应该具有描述性,能够清晰表示变量所代表的含义。
  6. 变量名不能使用语言的保留字(关键字)作为变量名。

比如上面我命名的a,b,c,d变量,虽然可以使用,但是意义不明确,下面演示正确的变量命名方式:

421ef7fa92fd4bc39a314c53545cf472.png

2. 变量的分类

全局变量:在大括号外部定义的变量就是全局变量,全局变量的使用范围更广,整个工程中想使用,都是有办法使用的。

局部变量:在大括号内部定义的变量就是局部变量,局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的。

80db3f184cef479b970985f9614d786b.png

如果局部和全局变量,名字相同呢?

e6398edb04fa422ab820cfc3abad4437.png

其实当局部变量和全局变量同名的时候,局部变量优先使用。 

437d269bb3374343a7a94672d95300d0.png

3. 强制类型转换

在操作符中还有⼀种特殊的操作符是强制类型转换,语法形式很简单,形式如下:

5311fcc04d4448c880d2f5302fa8ff57.png

请看代码:

3e5657c3872041bda4cac63e97b51b32.png

86815b868265454bad9279530b89c787.png

为了消除这个警告,我们可以使用强制类型转换:

7c2aa27d85e841cdb68a3aa7cee09048.png

fdfd3bc9ca6445619d0a0105773e8e77.png

俗话说,强扭的瓜不甜,我们使用强制类型转换都是万不得已的时候使用,如果不需要强制类型转化就能实现代码,这样自然更好。

二、scanf介绍

当我们有了变量,我们需要给变量输入值就可以使用 scanf 函数,如果需要将变量的值输出在屏幕上的时候可以使用printf函数,下面看一个例子:

28fcdd9551db4b92ba2a8e4adf305ef4.png

运行截图:

a404636ccf9041aea34357b4ff1d02e4.png

执行步骤:

1.屏幕输出:请输入你的成绩:

2.键盘输入:100

3.屏幕输出:你的成绩是:100

1. scanf的基本用法

scanf() 函数用于读取用户的键盘输入,当程序运行到这个语句时,会停下来,等待用户从键盘输入数据。

用户输入数据、按下回车键后,scanf() 就会处理用户的输入,将其存入变量,它的原型定义在头文件 stdio.h 里面。

scanf() 的语法跟 printf() 类似。

88884517509741af8fd2ef2234fa1371.png

它的第一个参数是一个格式字符串,里面会放置占位符(与 printf() 的占位符基本一致),告诉编 译器如何解读用户的输入,需要提取的数据是什么类型。

这是因为C语言的数据都是有类型的, scanf() 必须提前知道用户输入的数据类型,才能处理数据。

它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量。 上面示例中, scanf() 的第一个参数 %d ,表示用户输入的应该是一个整数。 第二个参数 &i 表示,将用户从键盘输入的整数存入变量i 。

注意:变量前面必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,而是地址, 即将变量 i 的地址指向用户输入的值。 如果这里的变量是指针变量(比如字符串变量),那就不用加 & 运算符。

下面是一次将键盘输入读入多个变量的例子。

5a11a275f7144ccbb4565792bc2194b6.png

上面示例中,格式字符串 %d%d%f%f ,表示用户输入的前两个是整数,后两个是浮点数,比如输入1、-20、3.4、-6.48 。这四个值依次放入 i 、 j 、 x 、 y 四个变量。

794a4927b2c64519ac438094947e0e10.png

scanf() 处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等。

所以,用户输入的数据之间,有一个或多个空格不影响 scanf() 解读数据。另外,用户使用回车键,将输入分成几行,也不影响解读。

19544310b17c4e35a37d0fc7ee59b76a.png

上面示例中,用户分成四行输入,得到的结果与一行入是完全一样的。每次按下回车键以后,

scanf() 就会开始解读,如果第一行匹配第一个占位符,那么下次按下回车键时,就会从第二个占 位符开始解读。

scanf() 处理用户输入的原理是,用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存 进行解读。 解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。

e5b128323cf34e6b9f76f12a8a5873e6.png

947734192b2543a2a8af0a6e30fbe229.png

上面示例中, scanf() 读取用户输入时, %d 占位符会忽略起首的空格,从 - 处开始获取数据,读 取到 -13 停下来,因为后面的 . 不属于整数的有效字符。这就是说,占位符 %d 会读到 -13 。 第二次调用scanf() 时,就会从上一次停止解读的地方,继续往下读取。这一次读取的首字符是 . ,由于对应的占位符是 %f ,会读取到 .45e12 ,这是采用科学计数法的浮点数格式。后面的# 不属于浮点数的有效字符,所以会停在这里。 由于 scanf() 可以连续处理多个占位符,所以上面的例子也可以写成下面这样。

d250c5e2a33b4fa5bdd867deaccf751b.png

39e21af66e5249529617502012e8c3c7.png

2. scanf的返回值

scanf() 的返回值是一个整数,表示成功读取的变量个数。 如果没有读取任何项,或者匹配失败,则返回 0 。

如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF。

0b10cb9136c84b888a39c47f9e338642.png

输入输出测试:

3dc0587fc079418e84fa3209008eea39.png

如果输入2个数后,按 ctrl+z ,提前结束输入:

64aa9d2978724bd3bab4cab93c42a205.png

在VS环境中按3次ctrl+z ,才结束了输入,我们可以看到r是2,表示正确读取了2个数值。 如果一个数字都不输入,直接按3次 ctrl+z ,输出的r是-1,也就是EOF

37e4548b38224291a979cad264377b1b.png

3. scanf的占位符

c5c7e6305c354afbbfcd768856ec0f95.png上面所有占位符之中,除了 %c 以外,都会自动忽略起首的空白字符。 %c 不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。

78e98652037c4430b44e24fdbe97711b.png

b6372faae098412f99e458d59016ff33.png

如果要强制跳过字符前的空白字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上一个空格,表示跳过零个或多个空白字符。

969e6ff78c424b1996332dc46d4aa5bf.png

090773ee79184cfc9c799bfa5a7d9617.png

下面要特别说一下占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。

因为 %s 不会包含空白字符,所以无法用来读取多个单词,除非多个 %s 一起使用。这也意味着,scanf() 不适合读取可能包含空格的字符串,比如书名或歌曲名。另外, scanf() 遇到 %s 占位 符,会在字符串变量末尾存储一个空字符 \0 。

scanf() 将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以,储存字符串时, 很可能会超过数组的边界,导致预想不到的结果。为了防止这种情况,使用 %s 占位符时,应该指定读入字符串的最长长度,即写成 %[m]s ,其中的 [m] 是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。

fc5e6784889045a88cafa40da0c44924.png

33cd07931cac495ba49bd7481d6ffd51.png

上面示例中, name 是⼀个长度为11的字符数组, scanf() 的占位符 %10s 表示最多读取用户输⼊ 的10个字符,后面的字符将被丢弃,这样就不会有数组溢出的风险了。

4. 赋值忽略符

有时,用户的输入可能不符合预定的格式。

0b0a6bfdac27490abd81a448b6c2deb3.png

0ba36c6e85344855922643481dc18b51.png

52809b46acef422597a58d67bebd65b3.png

上面示例中,如果用户输入 2020-01-01 ,就会正确解读出年、月、日。

问题是用户可能输入其他 格式,比如 2020/01/01 ,这种情况下, scanf() 解析数据就会失败。 为了避免这种情况, scanf() 提供了一个赋值忽略符(*) 。 只要把 * 加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。

c7e270272e5e4fa0aa601a745a0e1453.png

8a0f63df070344b797652cb894ef02d9.png

上面示例中, %*c 就是在占位符的百分号后面,加入了赋值忽略符 * ,表示这个占位符没有对应的变量,解读后不必返回。

结语:

本篇文章介绍了变量如何创建,以及scanf的基本用法,可以自己在编译器里实践并扩展。

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

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

相关文章

postgresql(Windows)初始化数据库教程

省流:本文章内容讲的是如何初始化postgresql数据库环境,前提是已经安装好postgresql数据库,安装步骤参考postgresql(Windows)安装教程 # 开始:安装postgresql-12.14-2-windows-x64.exe完成后进行初始化数据…

洋州影院购票系统:如何用Java、Spring Boot、Vue和MySQL实现现代化管理

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

在Java中调企微机器人发送消息到群里

目录 如何使用群机器人 消息类型及数据格式 文本类型 markdown类型 图片类型 图文类型 文件类型 模版卡片类型 文本通知模版卡片 图文展示模版卡片 消息发送频率限制 文件上传接口 Java 执行语句 String url "webhook的Url"; String result HttpReque…

pytest - Getting Start

前言 项目开发中有很多的功能,通常开发人员需要对自己编写的代码进行自测,除了借助postman等工具进行测试外,还需要编写单元测试对开发的代码进行测试,通过单元测试来判断代码是否能够实现需求,本文介绍的pytest模块是…

【超详细!各版本通用Matlab入门教程】0基础学会可用于毕业论文制图、数学,线代概率论运算等

MATLAB 下载、安装方法: 【若未安装环境,可以点击下方链接教程先学习安装,再进行MATLAB入门学习】 点击下方文字:即可跳转MATLAB下载&安装教程 下载&安装MATLAB 1.常识 1.1注释方法 % 中文内容【注释内容】 %% 段落注…

计算机导论10-软件与软件工程

文章目录 软件软件的概念软件的定义软件的特征 软件的保护与授权软件的法律保护软件许可 软件工程软件危机软件危机的概念产生软件危机的原因 软件工程的概念软件工程的定义软件工程基本原理软件工程框架软件工程三要素 软件工程方法学软件工程方法软件工程工具软件工程过程 软…

Mysql 编译安装部署

Mysql 编译安装部署 环境: 172.20.26.198(Centos7.6) 源码安装Mysql-5.7 大概步骤如下: 1、上传mysql-5.7.28.tar.gz 、boost_1_59_0.tar 到/usr/src 目录下 2、安装依赖 3、cmake 4、make && make install 5、…

(上) C语言中的语句分类及分支语句:if语句、switch语句介绍

目录 前言 一、语句的分类 1. 空语句 2. 表达式语句 3. 函数调用语句 4. 复合语句 5. 控制语句 二、分支语句 1. if语句 (1) if的使用 (2) else的使用 (3) 分支中包含多条语句 (4) 嵌套if (5) 悬空else问题 2. switch语句 (1) if语句和switch语句的对比 (2) s…

触摸屏监控双速电动机-确定地址分配

I/O地址分配 当选择了PLC之后,首先需要确定的是系统中各I/O点的绝对地址。在某些PLC 中1/O绝对地址的分配方式共有固定地址型、自动分配型、用户定义型3种。实际所使用的方式取决于所采用的PLC的CPU型号、编程软件、软件版本、编程人员的选择等因素。 本任务输入信…

鸿蒙 HarmonyOS ArkTS ArkUI 动画 中心缩放、顶部缩放、纵向缩放

EntryComponentstruct Index {State widthA: number 200State heightA: number 200onPageShow():void{animateTo ( {duration: 2000,iterations: -1,curve:Curve.Linear}, () > {this.widthA 0this.heightA 0} )}build() {Column() {// 中心缩放Column(){}.width(this.wi…

QT+opencv源码编译

时间记录:2024/1/20 一、版本介绍 QT5.12.7cmake3.22.0opencv4.5.4 二、编译步骤 (1)下载opencv源码,然后安装,opencv的安装即对源码的解压过程,解压后的文件目录如下 (2)openc…

全开源多城市同城信息小程序源码(Laravel 框架),同城分类信息发布便民小程序系统【非DZ】

同城生活分类信息小程序,人才招聘、房产二手 多城市地区同城分类信息发布,商家入驻等功能 小程序前后端代码开源无加密,可进行二次开发 【源码运行要求】 1、需要已认证的微信小程序 2、已备案的域名及服务器空间 推荐使用宝塔面板LinuxPHP…

热血江湖服务端服务器架设教程

热血江湖服务端服务器架设教程 大家好,我是艾西今天简单的说下热血江湖架设需要哪些东西然后怎么操作,不管你是自己玩还是对外开放,这对于有兴趣的小伙伴总的都是一件好事。技多不压身就是这么个道理,当你需要用上时还希望能记起…

Addressables(1) 从安装到加载单个/多个资源

不想再配改那些狗屎路径,准备研究一下Adressable,据说可以用key加载指定的资源 刚安装下来,随便搞了个资源勾选了一下addressable的框框,多了好多东西啊 概念铺天盖地而来,ok 没事的 慢慢来! 前置知识 P…

欧科云链与《警察技术》联合发布技术专题.pdf

欧科云链受《警察技术》邀请,于第201期期刊正式刊登“区块链生态安全与虚拟货币犯罪治理”技术专题。欧科云链作为该技术专题主要作者,直接参与本次期刊2篇文章撰写,同时为多篇文章提供欧科云链的最新数据和研究成果。 《警察技术》期刊创办于…

Python seaborn库的安装与图像的背景风格(Seaborn篇-01)

Python seaborn库的安装与图像的背景风格(Seaborn篇-01)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

使用docker配置semantic slam

一.Docker环境配置 1.拉取Docker镜像 sudo docker pull ubuntu:16.04拉取的为ununtu16版本镜像&#xff0c;环境十分干净&#xff0c;可以通过以下命令查看容器列表 sudo docker images 如果想删除多余的docker image&#xff0c;可以使用指令 sudo docker rmi -f <id&g…

linux 使用笔记

1.查看运行内存 a.Free 快速查看内存的方法&#xff0c;也是经常使用的命令&#xff0c; -h 更人性化的显示内存的单元 -m 以M的形式显示 b.Top Top命令提供了实时性的运行中的程序的资源使用统计。可以根据内存的使用和大小来进行排序。 如上所示&#xff0c;top命令可以看…

伊恩·斯图尔特《改变世界的17个方程》波动方程笔记

主要是课堂的补充&#xff08;yysy&#xff0c;我觉得课堂的教育模式真有够无聊的&#xff0c;PPT、写作业、考试&#xff0c;感受不到知识的魅力。 它告诉我们什么&#xff1f; 小提琴琴弦上某个小段的加速度&#xff0c;与相邻段相对于该段的平均位移成正比。 为什么重要&…

“GPC爬虫池有用吗?

作为光算科技的独有技术&#xff0c;在深入研究谷歌爬虫推出的一种吸引谷歌爬虫的手段 要知道GPC爬虫池是否有用&#xff0c;就要知道谷歌爬虫这一概念&#xff0c;谷歌作为一个搜索引擎&#xff0c;里面有成百上千亿个网站&#xff0c;对于里面的网站内容&#xff0c;自然不可…