字符串和格式化输入/输出

news2024/9/24 11:29:49

本文参考C Primerf Plus进行C语言学习

文章目录

  • 使用scanf()
    • 从scanf()角度看输入
    • 格式字符串中的普通字符
    • scanf()的返回值

1.使用scanf()

  • 如果用scanf()读取基本变量类型的值,在变量名前加上一个&;
  • 如果用scanf()把字符串读入字符数组中,不要使用&。
#include<stdio.h>
int main(void)
{
	int age;		//变量
	float assets;	//变量
	char pet[30];	//字符数组,用于储存字符串

	printf("Enter your age,assets,and favourite pet.\n");
	scanf("%d %f",&age,&assets);	//这里要使用&
	scanf("%s",pet);				//字符数组不使用&
	printf("%d $%.2 %s\n",age,assets,pet);

	return 0;
}

 运行结果:

        只要在每个输入项之间输入至少一个换行符、空格或制表符即可。

        唯一 例外的是%c转换说明。根据%c,scanf()会读取每个字符,包括空白。

        scanf()和printf()函数所用的转换说明与printf()函数几乎相同。主要区别是,float类型和double类型,printf()都使用%f、%e、%E、%g和%G转换说明。而scanf()只把它们用于float类型,对于double类型要使用1修饰符。

ASCⅠ C 中scanf()的转换说明
转换说明含义
%c把输入解释成字符
%d把输入解释成有符号十进制整数
%e、%f、%g、%a把输入解释成浮点数(C99标准新增了%a)
%E、%F、%G、%A把输入解释成浮点数(C99标准新增了%A)
%i把输入解释成有符号十进制整数
%o把输入解释成有符号八进制整数
%p把输入解释成指针(地址)
%s把输入解释成字符串。从第1个非空白字符开始,到下一个空白字符之前的所有字符都是输入
%u把输入解释成无符号十进制整数
%x、%X把输入解释成有符号十六进制整数
scanf()转换说明中的修饰符
转换说明含义
*抑制赋值(详见后面解释)
示例:"%*d"
数字最大字段宽度。输入达到最大字段宽度处,或第1次遇到空白字符时停止
示例:"%10s"
hh把整数作为signed char或unsigned char类型读取
示例:"%hhd"、"%hhu"
11把整数作为long long或unsigned long long 类型读取(C99)
示例:"%lld"、"%llu"
h、1或L"%hd"和”%hi”表明把对应的值储存为short int类型
"%ho"、"%hx"和"%hu"表明把对应的值储存为unsigned shot int 类型
号“%1d"和"%1i"表明把对应的值储存为long类型
"%1o"、"%1x"和"%1u"表明把对应的值储存为unsigned long 类型
"%1f"、"%1e"和"%1g"表明把对应的值储存为double类型
在 e、f 和g前面使用 L而不是1,表明把对应的值被储存为long double 类型。如果没有修饰符,d、i、o和x表明对应的值被储存为int 类型,f和g表明把的值储存为float 类型
j在整型转换说明后面时,表明使用intmax_t或uintmax_t类型(C99)
示例:"%zd"、"%zo"
z在整型转换说明后面时,表明使用sizeof的返回类型(C99)
t在整型转换说明后面时,表明使用表示两个指针差值的类型(C99 )示例:"%td"、"%tx"


        如你所见,使用转换说明比较复杂,而且这些表中还省略了一些特性。省略的主要特性是,从高贸式化源中读取选定数据,如穿孔卡或其他数据记录。因为在本书中,scanf()主要作为与程序交互的便工具,所以我们不在书中讨论更复杂的特性。
1.从scanf()角度看输入

        接下来,我们更详细地研究scanf()怎样读取输入。假设scanf()根据一个%d转换说明读取一个整数scanf()函数每次读取一个字符,跳过所有的空白字符,直至遇到第1个非空白字符才开始读取。因为要取整数,所以scanf()希望发现一个数字字符或者一个符号(+或-)。如果找到一个数字或符号,它便保存该字符,并读取下一个字符。如果下一个字符是数字,它便保存该数字并读取下一个字符。scanf()不断地读取和保存字符,直至遇到非数字字符。如果遇到一个非数字字符,它便认为读到了整数的末尾。然后,scant把非数字字符放回输入。这意味着程序在下一次读取输入时,首先读到的是上一次读取丢弃的非数字字符,最后,scanf()计算已读取数字(可能还有符号)相应的数值,并将计算后的值放入指定的变量中。

        如果使用字段宽度,scanf()会在字段结尾或第1个空白字符处停止读取(满足两个条件之一便停止)。

        如果第1个非空白字符是A而不是数字,会发生什么情况?scanf()将停在那里,并把A放回输入中,不会把值赋给指定变量。程序在下一次读取输入时,首先读到的字符是A。如果程序只使用gd转换说明,scanf()就一直无法越过A读下一个字符。另外,如果使用带多个转换说明的scanf(),C规定在第1个出错处停止读取输入。

        用其他数值匹配的转换说明读取输入和用%d的情况相同。区别在于scanf()会把更多字符识别成数字的一部分。例如,%x转换说明要求scanf()识别十六进制数 a~f和 A~F。浮点转换说明要求scanf()识别小数点、e记数法(指数记数法)和新增的p记数法(十六进制指数记数法)。

        如果使用%s转换说明,scanf()会读取除空白以外的所有字符。scanf()跳过空白开始读取第1个非空白字符,并保存非空白字符直到再次遇到空白。这意味着scanf()根据s转换说明读取一个单词,即不包含空白字符的字符串。如果使用字段宽度,scanf()在字段末尾或第1个空白字符处停止读取。无法利用字段宽度让只有一个%s的scanf()读取多个单词。最后要注意一点:当scanf()把字符串放进指定数组中时,它会在字符序列的末尾加上'\0',让数组中的内容成为一个C字符串。

        实际上,在C语言中scanf()并不是最常用的输入函数。这里重点介绍它是因为它能读取不同类型数据。C语言还有其他的输入函数,如getchar()和fgets()。这两个函数更适合处理一些特殊情况,如读取单个字符或包含空格的字符串。目前,无论程序中需要读取整数、小数、字符还是字符串,都可以使用scanf()函数。

2.格式字符串中的普通字符

        scanf()函数允许把普通字符放在格式字符串中。除空格字符外的普通字符必须与输入字符串严格匹配。例如,假设在两个转换说明中添加一个逗号:

        scanf("%d,%d",&n, &m);

        scanf()函数将其解释成:用户将输入一个数字、一个逗号,然后再输入一个数字。也就是说,用户必须像下面这样进行输入两个整数:

        88,121

        由于格式字符串中,%d后面紧跟逗号,所以必须在输入88后再输入一个逗号。但是,由于scanf会跳过整数前面的空白,所以下面两种输入方式都可以:

        88,121
        和
        88,
        121

        格式字符串中的空白意味着跳过下一个输入项前面的所有空白。例如,对于下面的语句:

        scanf("%d ,%d", &n, &m);

        以下的输入格式都没问题:

        88,121

        88,121 

        88,121

        请注意,“所有空白”的概念包括没有空格的特殊情况。

        除了%c,其他转换说明都会自动跳过待输入值前面所有的空白。因此,scanf("%d%d",&n,
&m)与scanf("%d %d",&n,&m)的行为相同。对于%c,在格式字符串中添加一个空格字符会有所不同。例如,如果把%c放在格式字符串中的空格前面,scanf()便会跳过空格,从第1个非空白字符开始读取。也就是说,scanf("%c",&ch)从输入中的第1个字符开始读取,而 scanf("%c",&ch)则从第1个非空白字符开始读取。

3.scanf()的返回值

        scanf()函数返回成功读取的项数。如果没有读取任何项,且需要读取一个数字而用户却输入一个非数值字符串,scanf()便返回0。当scanf()检测到“文件结尾”时,会返回EOF(EOF是stdio.h中定义的特殊值,通常用#define 指令把EOF 定义为-1)。在读者学会if语句和while语句后,便可使用scanf()的返回值来检测和处理不匹配的输入。
 

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

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

相关文章

Kotlin快速入门系列6

Kotlin的接口与扩展 接口 与Java类似&#xff0c;Kotlin使用interface关键字定义接口&#xff0c;同时允许方法有默认实现&#xff1a; interface KtInterfaceTest {fun method()fun methodGo(){println("上面方法未实现&#xff0c;此方法已实现")} } 接口实现 …

提升编程效率的利器: 解析Google Guava库之集合篇RangeSet范围集合(五)

在编程中&#xff0c;我们经常需要处理各种范围集合&#xff0c;例如时间范围、数字范围等。传统的集合类库往往只能处理离散的元素集合&#xff0c;对于范围集合的处理则显得力不从心。为了解决这个问题&#xff0c;Google的Guava库提供了一种强大的数据结构——RangeSet&…

【JLU】校园网linux客户端运行方法

终于给这输入法整好了&#xff0c;就像上面图里那样执行命令就行 写一个开机自启的脚本会更方便&#xff0c;每次都运行也挺烦的 补充了一键运行脚本&#xff0c;文件路径$DIR需要自己修改 #!/bin/bash DIR"/home/d0/ubuntu-drclient-64/DrClient" run_per_prog&qu…

微信小程序上传时报错message:Error: 系统错误,错误码:80051,source size 2148KB exceed max limit 2MB

问题&#xff1a; 微信小程序上传时错误码&#xff1a;80051,source size 2248KB exceed max limit 2MB 问题原因&#xff1a; 由于代码中的静态资源 图片大小超了200k以及主包的体积超出1.5M 解决办法 分包 tabBar 是主包的&#xff0c;不需要分包处理&#xff0c;以下是分…

0130-2-秋招面试—HTML篇

2023 HTML面试题 1.src和href的区别 scr用于替换当前元素&#xff0c;href用于在当前文档和外部资源之间建立联系。 <script src"main.js"></script><link href"style.css" rel"stylesheet" />2.对HTML语义化的理解 根据内…

Linux:重定向

Linux&#xff1a;重定向 输出重定向追加重定向输出重定向与追加重定向的本质输入重定向 输出重定向 在Linux中&#xff0c;输出重定向是一种将命令的输出发送到不同位置的方法。通常&#xff0c;执行命令时&#xff0c;输出会显示在终端上。然而&#xff0c;使用输出重定向&a…

5-1 A. DS串应用--KMP算法

题目描述 学习KMP算法&#xff0c;给出主串和模式串&#xff0c;求模式串在主串的位置 算法框架如下&#xff0c;仅供参考 输入 第一个输入t&#xff0c;表示有t个实例 第二行输入第1个实例的主串&#xff0c;第三行输入第1个实例的模式串 以此类推 输入样例&#xff1a; 3 qwe…

产品经理的发展方向是什么?市场需求现状如何?未来有哪些趋势?作为产品经理应该如何准备?

目录 了解产品经理的发展方向 市场需求现状 未来有那些趋势&#xff1f; 作为产品经理应该作何准备? 了解产品经理的发展方向 市场需求现状 未来有那些趋势&#xff1f; 个人软件 &#xff1a;智能终端&#xff0c;轻量化应用&#xff0c;虚拟社交等企业软件&#xff1a…

用GoLand写一个小玩意-git定时push、commit

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 背景 有时候你想刷一刷github的commit墙&#xff0c;或者公司需要每天提交代码&#xff0c;你想摸鱼。就有这么一个小需求&#xff0c;想要自动commit、push代码…

solr的原理是什么

1 Java程序里如果有无限for循环的代码导致CPU负载超高&#xff0c;如何排查&#xff1f; 排查Java程序中由于无限循环导致的CPU负载过高的问题&#xff0c;可以按照以下步骤进行&#xff1a; 资源监控&#xff1a; 使用系统命令行工具&#xff08;如Linux上的top或htop&#xf…

Arrays.asList()方法调用add()或remove()抛出java.lang.UnsupportedOperationException问题

在使用Arrays.asList方法将以,分割的字符串转为list集合时&#xff0c;调用add和remove等方法时会抛出java.lang.UnsupportedOperationException。以下为原因和解决方法。 原因&#xff1a; Arrays.asList()方法返回了一个Arrays类的一个继承了AbstractList的ArrayList内部类…

富文本编辑器CKEditor4简单使用-03(图片上传)

富文本编辑器CKEditor4简单使用-03&#xff08;图片上传&#xff09; 1. 前言1.1 关于CKEditor4的安装及简单使用1.2 关于CKEditor4的插件安装及使用1.3 关于Easy Image 2. CKEditor4自带的默认上传图片按钮功能3. 使用增强的图像插件3.1 什么是增强的图像插件3.2 下载并安装增…

jdk17新特性—— instanceof的模式匹配

目录 一、instanceof模式匹配的概述二、instanceof模式匹配代码示例2.1、jdk17之前 instanceof用法 代码示例2.2、jdk17及之后 instanceof用法 代码示例一2.3、jdk17及之后 instanceof用法 代码示例二 一、instanceof模式匹配的概述 instanceof增加了模式匹配功能&#xff0c;…

vue3之echarts3D环柱图-间隔版

vue3之echarts3D环柱图-间隔版 效果&#xff1a; 版本 "echarts": "^5.4.1", "echarts-gl": "^2.0.9" 核心代码&#xff1a; <template><div class"content"><div ref"eCharts" class"c…

分享4款不能错过的修改照片尺寸的软件!

在当今这个数字化时代&#xff0c;照片已经成为我们分享生活、表达观点的重要方式。但是&#xff0c;你是否曾遇到过这样的问题&#xff1a;一张精美的照片因为尺寸不合适而无法在朋友圈中展现出最佳效果&#xff1f;不用担心&#xff0c;今天我们就来聊聊那些可以帮助你轻松修…

Day02-课后练习2-参考答案(数据类型和运算符)

文章目录 巩固题1、案例&#xff1a;今天是周2&#xff0c;100天以后是周几&#xff1f;2、案例&#xff1a;求三个整数x,y,z中的最大值3、案例&#xff1a;判断今年是否是闰年4、分析如下代码的计算结果5、分析如下代码的计算结果6、分析如下代码的计算结果7、分析如下代码的计…

Real power also called true or active power

Real power also called true or active power flyfish 三相电路的总功率都等于各相功率之和&#xff0c;任意相的有功功率等于该相的相电压乘以相电流&#xff0c;再乘以该相负载的功率因数。 P P A P B P C PP_AP_BP_C PPA​PB​PC​ P有功功率&#xff0c;瓦特(W) U电压…

Springboot 实现基于用户和物品的协同过滤算法

目录 简介 协同过滤算法(简称CF) 算法详解 算法使用 基于用户 基于物品 总结 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停…

简单线性Dp

文章目录 线性Dp的定义AcWing 898. 数字三角形思路CODE正序倒序 AcWing 895. 最长上升子序列Dp 分析CODE AcWing 897. 最长公共子序列Dp 分析CODE 线性Dp的定义 处理起来是线性的&#xff08;&#xff1f;&#xff1f;&#xff1f;&#xff09;&#xff0c;这部分交给ai老先生…

Gurobi输出日志文件的解读【Gurobi】

本章来解读一下Gurobi的刷屏式输出&#xff0c;根本不需要cout&#xff0c;直接通过model.optimize();进行输出。 例如&#xff1a; 现在我们来逐行解读一下&#xff1a; 第一部分&#xff1a;版本型号 可以直接跳过 CPU model: 12th Gen Intel(R) Core(TM) i5-12500H, instr…