C 语言的 scanf() 函数

文章目录

  • 概述
  • 转换说明
    • int
    • float
    • double
    • 字符串
  • 修饰符 modifier
  • 格式字符串中的空白
  • 格式字符串中的普通字符
  • * 修饰符

概述

作用:

Read formatted data from the standard input stream.

函数原型:

int scanf( const char *format [,argument]… );

Parameters:
format: Format control string
argument: Optional arguments

Return Value:

return the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.

C 语言通过函数原型检查函数调用时的实参个数和类型是否正确。

但是这个机制对于 scanf 和 printf 都不起作用,因为这两个函数的函数原型中参数个数是可变的。

程序员要自己负责转化说明的数量、类型与后面的参数的数量、类型匹配。

从键盘输入的都是文本, 因为键盘只能产生文本字符.

例如, 要输入数字 10, 就要用键盘键入字符 1 和字符 0.

但是计算机中存储的数据都是数值类型, 因此需要将字符转换为数值类型.

scanf 将键入的字符串转换为整数, 浮点数, 字符或字符串等等, 而 printf 要完成的任务则刚好相反, 将整数, 浮点数, 字符和字符串等等转换为显示在屏幕上的文本.

scanf 和 printf 一样也要使用格式字符串和参数列表, scanf 中的格式字符串表明字符输入流的目标数据类型.

scanf 和 printf 的主要区别在于, printf 使用变量, 常量和表达式, 而 scanf 使用指向变量的指针.

在这里插入图片描述

转换说明

在这里插入图片描述

int

%d

%d 可以识别键入内容中的 +-0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

float

%f

double

%lf

字符串

%s

只会读取第一个单词, 遇到空白就结束读取, 剩余内容保留在缓存中, 等待下一个读取的命令, 作为下一个读取命令的输入.

代码示例:

#include<stdio.h>
int main(void)
{char str1[10], str2[20];printf("Enter your name: ");scanf("%s", str1);scanf("%s", str2);printf("%s\n", str1);printf("%s\n", str2);return 0;
}

结果:

Enter your name: mike tom
mike
tom

一次性输入两个单词, 用空格分隔, 第一个单词被 scanf("%s", str1); 语句读入, mike 储存在 str1 中, 剩下的空格和 tom 留在缓存中, 遇到 scanf("%s", str2); 语句时被读入, 其中空格被忽略, tom 被储存在 str2 中.

修饰符 modifier

可以在转换说明中 (百分号和转换字符之间) 使用修饰符.

当使用多个修饰符时, 需要按照下表所示顺序书写:

在这里插入图片描述

格式字符串中的空白

scanf 使用空白将键入的内容分成多个字段.

在依次将转换说明和字段进行匹配时跳过键入的内容中的这些空白.

唯一例外的是 %c 转换说明, 根据 %c 转换说明, scanf 将会读入键入的每一个字符, 包括空白.

%c 将键入的所有字符都读入, 包括空白.

除了 %c 之外的其他转换说明, 将会跳过键入的内容中的空白, 直到遇到非空白字符, 才开始尝试读取这个非空白字符, 如果符合转换说明要求的格式, 则进行读入, 否则发生错误, 这些键入的内容依然存在于缓存中, 留待下一次读入.

程序在下一次读取时, 首先碰到的是上一次读取时丢弃的内容.

对于带有多个转换说明的 scanf 函数, C 规定, 在第 1 个出错的地方就停止读取输入.

格式字符串中的普通字符

scanf 函数允许把普通字符放在格式字符串中, 除了空格外的普通字符必须与键入的内容严格匹配.

例如下面的这个输入:

scanf("%d,%d",&a,&b);

被解释为: 用户需要键入一个数字, 一个逗号, 一个数字.

由于在这个格式字符串中, 第一个 %d 后面紧跟着一个逗号, 所以在键入的内容中, 第一个数字后面必须紧跟一个逗号.

第二个 %d 在读取键入的内容时, 会跳过第二个数字前面的所有空白.

程序示例:

#include<stdio.h>int main(void)
{int a = 0,b=0;printf("输入两个整数:");scanf("%d,%d", &a, &b);printf("%d  %d\n", a, b);return 0;
}

结果1:

输入两个整数:1,2
1  2

可以看出, 两个整数都读取成功.

结果2:

输入两个整数:1 ,2
1  0

a 读取成功, b 读取失败, 还是原来的值, 即 0.

结果3:

输入两个整数:1, 2
1  2

逗号紧跟第一个数, 第二个数和逗号之间可以有空白.

格式字符串中的空白意味着跳过下一个输入项前面的所有空白.

程序示例:

#include<stdio.h>int main(void)
{int a = 0,b=0;printf("输入两个整数:");scanf("%d ,%d", &a, &b);printf("%d  %d\n", a, b);return 0;
}

结果1:

输入两个整数:1 ,2
1  2

所有空白也包括没有空白的特殊情况:

结果2:

输入两个整数:1,2
1  2

除了 %c 之外的其他转换说明, 将会跳过键入的内容中的空白, 因此下面这两句话效果相同:

scanf(“%d%d”, &a, &b); // 没有空白
scanf(“%d %d”, &a, &b); // 有空白

根据 %c 转换说明, scanf 将会读入键入的每一个字符, 包括空白. 但是如果 %c 前面有一个空格, 则键入内容中的空白将被忽视, 从第一个非空白字符开始读取.

scanf("%c", &ch); 从键入内容的第一个字符开始读取, 包括空白符.

scanf(" %c", &ch); 从键入内容的第一个非空白字符开始读取.

* 修饰符

把 * 放在 % 和转换字符之间会使得 scanf 跳过相应的输出项.

程序示例:

#include<stdio.h>int main(void)
{printf("Please enter three integers: ");int a = 0, b = 0, c = 0;scanf("%*d %*d %d", &c);printf("The last integer is %d.\n", c);return 0;
}

带了 * 则后面不需要对应的变量去接受键入的内容. 因此这里只需要一个变量 c.

在程序中需要读取文件中特定列的内容时, 这项跳过功能很有用.

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

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

相关文章

Packet Tracer - 实施基本连接

Packet Tracer - 实施基本连接 地址分配表 设备 接口 IP 地址 子网掩码 S1 VLAN 1 192.168.1.253 255.255.255.0 S2 VLAN 1 192.168.1.254 255.255.255.0 PC1 网卡 192.168.1.1 255.255.255.0 PC2 网卡 192.168.1.2 255.255.255.0 拓扑图 目标 第 1 部分…

【数据结构与算法——TypeScript】算法的复杂度分析、 数组和链表的对比

【数据结构与算法——TypeScript】 算法的复杂度分析 什么是算法复杂度(现实案例)&#xff1f; ❤️‍&#x1f525; 前面已经解释了什么是算法&#xff1f; 其实就是解决问题的一系列步骤操作、逻辑。 ✅ 对于同一个问题&#xff0c;我们往往有很多种解决思路和方法&#x…

Adaptive autosar 都有哪些模块?各有什么功能?

Adaptive autosar是一种用于高性能计算ECU的软件平台,它支持自适应应用程序的开发和运行。它由两部分组成:基础(Foundation)和服务(Service)。基础包括了操作系统接口、执行管理、网络管理、识别访问管理、加密、更新和配置管理等功能。服务包括了通信管理、RESTful、时间…

OPENCV C++(四)形态学操作+连通域统计

形态学操作 先得到一个卷积核 Mat kernel getStructuringElement(MORPH_RECT,Size(5,5)); 第一个是形状 第二个是卷积核大小 依次为腐蚀 膨胀 开运算 闭运算 Mat erodemat,dilatemat,openmat,closemat;morphologyEx(result1, erodemat, MORPH_ERODE, kernel);morphologyEx…

命令行快捷键Mac Iterm2

原文:Jump forwards, backwards and delete a word in iTerm2 on Mac OS iTerm2并不允许你使用 ⌥← 或 ⌥→ 来跳过单词。 你也不能使用 ⌥backspace 来删除整个单词。 下面是在Mac OS上如何配置iTerm2以便能做到这一点的方法。 退格键 首先&#xff0c;你需要将你的左侧 ⌥…

NVIDIA 535.86.05 Linux 图形驱动程序改进 Wayland 支持

导读NVIDIA公司近日发布了适用于 Linux、FreeBSD 和 Solaris 系统的 NVIDIA 535.86.05 图形驱动程序&#xff0c;作为其生产分支的维护更新&#xff0c;解决了各种错误和问题。 NVIDIA 535.86.05 是在 NVIDIA 535.54.03 发布一个多月之后发布的&#xff0c;它通过解决在使用某…

Mac 创建和删除 Automator 工作流程,设置 Terminal 快捷键

1. 创建 Automator 流程 本文以创建一个快捷键启动 Terminal 的自动操作为示例。 点击打开 自动操作&#xff1b; 点击 新建文稿 点击 快速操作 选择 运行 AppleScript 填入以下内容 保存名为 “Open Terminal” 打开 设置 > 键盘&#xff0c;选择 键盘快捷键 以此选择 服…

深度学习(32)——CycleGAN(1)

深度学习&#xff08;32&#xff09;——CycleGAN&#xff08;1&#xff09; 文章目录 深度学习&#xff08;32&#xff09;——CycleGAN&#xff08;1&#xff09;1. GAN原理2. CycleGAN&#xff08;1&#xff09;原理&#xff08;2&#xff09;核心思想&#xff08;3&#xf…

直播课 | 大橡科技研发总监丁端尘博士“类器官芯片技术在新药研发中的应用”

从类器官到类器官芯片&#xff0c;正在生物科学领域大放异彩。 药物研发需要新方法 众所周知&#xff0c;一款新药是一个风险大、周期长、成本高的艰难历程&#xff0c;国际上有一个传统的“双十”说法——10年时间&#xff0c;10亿美金&#xff0c;才可能成功研发出一款新药…

8.4 day05软件学习

文章目录 微服务的概念微服务的原则微服务的特征&#xff1a;集群介绍 spring aop 在家学习效率真不高&#xff0c;下午好兄弟喊出去玩&#xff0c;一直到晚上才回来&#xff0c;赶紧总结一下早上学习的内容。 继续看java基础进阶的思想&#xff0c;之前学的很多都忘了。 微服…

【JDK 11】【JDK 8】项目 jdk 版本升级,修改方案与实践

前言 工作中&#xff0c;难免会遇到升级版本的事情。这次由于两个系统中&#xff0c;系统 A 是用的 JDK8 版本&#xff0c;系统 B 是用 JDK11 版本&#xff1b;要求同步 JDK 版本&#xff0c;也就是升级到11版本。那么接下来将进行介绍~ 问题与解决 1. .sh 脚本启动无法启动…

JVM | 从类加载到JVM内存结构

引言 我在上篇文章&#xff1a;JVM | 基于类加载的一次完全实践 中为你讲解如何请“建筑工人”来做一些定制化的工作。但是&#xff0c;大型的Java应用程序时&#xff0c;材料&#xff08;类&#xff09;何止数万&#xff0c;我们直接堆放在工地上&#xff08;JVM&#xff09;…