C语言KR圣经笔记 7.1标准输入和输出 7.2格式化输出-printf

news2024/11/18 8:45:27

第七章 输入和输出


输入和输出功能并不是 C 语言本身的一部分,故到目前为止,本书都没有对其着重说明。然而,程序与其环境之间交互的方式,比书中之前所展示的更为复杂。本章我们会详描述标准库,即一系列为 C 程序提供输入输出、字符串处理、内存管理、数学例程及其他各种服务的函数。

ANSI 标准精确定义了这些库函数,因此在任何有 C 语言的系统中也都有这些标准库函数,并且是互相兼容的。如果一个程序只使用了标准库提供的功能来与系统进行交互,那么这个程序不用修改就可以从一个系统移植到另一个系统。

库函数的特性在超过一打的头文件中指定【C89时是15个,C11时将近30个】;有些我们已经见过,如 <stdio.h>、<string.h> 和 <ctype.h>。本章不会介绍库的全部内容,因为我们更感兴趣的是如何使用库来写 C 程序。库的细节在附录 B 描述。

7.1 标准输入和输出

如第一章所述,库函数实现了文本输入输出的简单模型。文本流包含了行的序列;每行以一个换行字符结束。如果系统不是按这个方式操作的,库会采取必要的措施,使其看起来像是如此。例如,库可以在输入中把回车符加换行符转换成换行符,并在输出中做反向的转换。

最简单的输入方式是使用 getchar 从“标准输入”(通常是键盘)中每次读一个字符:

int getchar(void)

getchar 每次被调用时返回下一个输入字符,若遇到文件结尾时返回 EOF。符号常量 EOF 在<stdio.h> 中定义。通常其值为 -1,但写判断时应该用 EOF,这样才不依赖特定的值。

在很多环境下,使用输入重定向符号 < ,能把键盘替换成文件:如果程序 prog 使用了 getchar,则如下命令行

prog <infile

使 prog 改从 infile 中读取字符。prog 程序本身不感知输入的切换;特别注意 “infile” 字符串并不包含在 argv 的命令行参数列表中。如果通过管道机制使输入来自另一个程序,输入切换也是不可见的:在某些系统上,命令行

otherprog | prog

运行 otherprog 和 prog 两个程序,并把 otherprog 的标准输出通过管道送到 prog 的标准输入中。

函数

int putchar(int)

用于输出:putchar(c) 将 c 输出到 “标准输出”中,默认为屏幕。putchar 返回已输出的字符,若遇到错误则返回 EOF。和输入一样,通常可以使用 >filename 将输出重定向到文件中:如果 prog 使用了 putchar,则

prog >outfile

把标准输出写到 outfile 文件。如果系统支持管道机制,则

prog | anotherprog

把 prog 的标准输出送到 anotherprog 的标准输入中。

printf 产生的输出也是送往标准输出。我们可以交替调用putchar 和 printf ——输出显示的顺序就是调用的顺序。

每个引用标准输入输出库函数的源文件,都必须在首次引用之前包含下面这行

#include <stdio.h>

当文件名用尖括号括起来时,会在一些标准的文件路径集合中搜索头文件(例如,在UNIX系统中,通常在 /usr/include 目录下)。


很多程序只读一个输入流且只写一个输出流;对这样的程序,使用 getchar,putchar 和 printf 来做输入输出也许就完全够了,而对入门来说是肯定够的。如果使用重定向把一个程序的输出连接到下一个程序的输入,则更是如此。例如,考虑这个把输入转换成小写的程序 lower:

#include <stdio.h>
#include <ctype.h>

main()    /* lower:把输入转换成小写 */
{
    int c;

    while((c = getchar()) != EOF)
        putchar(tolower(c));
    return 0;
}

tolower 函数定义在 <ctype.h> 中;它将一个大小字母转换成小写,而其他字符则原封不动地返回。我们前面提到过,如 <stdio.h> 中的 getchar 和 putchar 以及 <ctype.h> 中的 tolower,这样的“函数” 通常是宏定义,因此可以避免对每个字符做函数调用带来的开销。我们将在8.5节展示如何做到这一点。无论在特定的机器上 <ctype.h> 中的函数是如何实现的,标准库都对使用这些函数的程序屏蔽了具体的字符集。

练习7-1、写一个程序,可以将大写转换成小写、或将小写转换成大写,具体要做哪种转换,是根据该程序被调用时的名字(通过 argv[0] 获取)来决定的。

7.2 格式化输出——printf

输出函数 printf 将内部的值转换为字符串。在前面的章节中我们不太正式地使用了 printf。本节覆盖了它最典型的用法,但不是全部内容;完整内容参见附录 B。

int printf(char *format, arg1, arg2, ...)

printf 在 format 的控制下,对其参数做转换、格式化,并打印到标准输出。它返回已打印的字符数量。

格式化字符串包含两种对象:拷贝到输出流的普通字符,以及转换规格:每个转换规格都会使printf 的下一个参数被转换并打印出来。每个转换规格以一个 % 开头,并以一个转换字符结尾。在 % 和转换字符之间,依次可以为:

  • 减号,表明被转换的参数要左对齐。
  • 数字,指定了最小的域宽度。被转换的参数会打印在最小为该宽度的域中。若宽度不够,则会在左边填充到足够的宽度。(如果指定了左对齐,则在右边填充)
  • 点号,分隔域宽度和精度。
  • 数字,表示精度,有三种情况。对于字符串:指定了字符串中最多打印的字符数。对于浮点数:小数点后最多的位数。对于整数:最少的位数。
  • 字母 h 或 l,用于整数打印,前者表示打印为 short,后者表示打印为 long

转换字符见表 7-1。若 % 之后不是转换说明,则该行为是未定义的。

表7-1 基本的 printf 转换说明
字符类型打印为
d,iint十进制数
oint无符号八进制数(无前导0)
x,Xint无符号十六进制数(无前导0x或0X),使用abcdef或ABCDEF表示 10到15。
uint无符号十进制数
cint单个字符
schar *打印字符串中的字符,直到遇到'\0',或者精度给出的字符数。
fdouble[-]m.dddddd,其中d的数量由精度决定(默认为6)
e,Edouble[-]m.dddddde+-xx 或 [-]m.ddddddE+-xx,其中d的数量由精度决定(默认为6)
g,Gdouble如果幂小于-4或大等于精度时,使用 %e或%E;否则使用 %f。末尾的0和结尾的小数点不打印。
pvoid *指针(由具体实现来决定如何呈现)
%无转换参数打印%

宽度和精度可以指定为 * ,这种情况下它的值是通过转换下一个参数(必须为int)计算出来的。例如,要在字符串 s 中最多打印 max 个字符,写为:

printf("%.*s", max, s);

大部分的格式转换已经在前面的章节中说明过了。不过还有字符串的精度没讲过。下表显示了不同规格下打印 “hello, world”(12个字符)的效果。我们在两边加上了冒号,以便读者看清其范围:

警告:printf 使用它的首个参数来确定其后跟着多少个参数,以及这些参数各自的类型。如果没有足够的参数,或者类型错误,则 printf 会被搞混,而你的代码将得到错误的结果。还应该注意下面两个调用的不同之处:

printf(s);          /* 若s包含%则有问题 */
printf("%s", s);    /* 安全 */


sprintf 函数做与 printf 同样的转换,不过它把输出储存到一个字符串里:

int sprintf(char *string, char *format, arg1, arg2, ...)

sprintf 也是同样根据 format 将参数 arg1, arg2 等格式化,不过是将结果保存在 string 里面,而不是标准输出;string 必须足够大以接收这个结果。

练习7-2、写个程序,以合理的方式打印任意输入。最低限度下,它能够按本地习惯用八进制或十六进制打印非图形字符,且能够断开长文本行。

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

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

相关文章

EMC学习笔记(二十一)降低EMI的PCB设计指南(一)

降低EMI的PCB设计指南&#xff08;一&#xff09; 1.概述2.射频3.连接器与过孔元件4.静态引脚和动态引脚和输入5.基本回路6.差模与共模 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 1.概述 印刷电路板(PCB)的一般布局准则&#xff0c;基本上都有相对的文件进…

应用层 HTTP协议(1)

回顾 前面我们说到了数据链路层,网络层IP协议,传输层的TCP/UDP协议一些知识点,现在让我们谈谈 应用层的HTTP协议的知识点. 这篇我们先从大局入手,仍然是对总体报文进行全局分析,再对细节报文进行拆解分析 版本 首先我们谈谈HTTP协议的版本 HTTP 0.9 (1991) HTTP 1.0 (1992 - 1…

阿里云游戏服务器多少钱一年?

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

C++ 水仙花数

案例描述&#xff1a;水仙花数是指一个3位数&#xff0c;它的每个位上的数字的3次幂之和等于它本身例如&#xff1a; 1A35A33A3153 请利用do.…while语句&#xff0c;求出所有3位数中的水仙花数 分析思路&#xff1a; 1、将所有的三位数进行输出&#xff08;100~999&#x…

SPSSAU上线文本分析啦|“尔滨”旅游攻略文本分析

一、什么是文本分析&#xff1f; 作为一种新兴的基于定性研究的量化分析方法&#xff0c;文本分析法能够揭示文本的变化与特征&#xff0c;为经典问题的研究提供了新思路。 文本分析应用于多个领域&#xff0c;比如在旅游业中&#xff0c;可以通过文本分析去研究旅游形象感知…

动态规划的一个初步学习

啥叫动态规划 在我们写很多的题目时&#xff0c;常常可以用暴力枚举来写&#xff0c;缺点就是速度太慢了。如果我们用一个数组或者哈希表&#xff08;虽然我还没学过哈希表&#xff09;将之前暴力枚举的数据储存起来&#xff0c;当再一次枚举到这个数字的时候就直接调用数组或…

异构计算关键技术之mmap

异构计算关键技术之mmap 一、背景 1. 日志存储系统 case 1&#xff1a;分布式日志存储系统&#xff0c;是一个基于raft协议自研分布式日志存储系统&#xff0c;logstore则是底层存储引擎。 logstore中&#xff0c;使用mmap对数据文件读写。 logstore的存储结构简化如下图&a…

请问半吊子 C++选手该如何深入学习 C++?

请问半吊子 C选手该如何深入学习 C? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff0…

清空队列的方法

注意&#xff1a;C中的队列queue自身不支持clear操作&#xff0c;但双端队列deque是支持clear操作的。 方法一&#xff1a;直接用空的队列对象赋值 代码&#xff1a; queue<int> q; qqueue<int>(); 方法二&#xff1a;遍历出队列 代码&#xff1a; while(!q…

VitePress-14- 配置-titleTemplate 的作用详解

作用描述 1、titleTemplate 是标题的后缀&#xff1b;2、可以自定义标题的后缀&#xff1b;3、可以自定义整个的标题以及后缀&#xff0c;语法如下&#xff1a; titleTemplate: :title 链接符号 自己定义的后缀 【:title】&#xff1a;从页面的第一个 <h1> 标题推断出的…

《计算思维导论》笔记:10.4 关系模型-关系运算

《大学计算机—计算思维导论》&#xff08;战德臣 哈尔滨工业大学&#xff09; 《10.4 关系模型-关系运算》 一、引言 本章介绍数据库的基本数据模型&#xff1a;关系模型-关系运算。 二、什么是关系运算 在数据库理论中&#xff0c;关系运算&#xff08;Relational Operatio…

【开源】SpringBoot框架开发校园疫情防控管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生2.2 老师2.3 学校管理部门 三、系统展示四、核心代码4.1 新增健康情况上报4.2 查询健康咨询4.3 新增离返校申请4.4 查询防疫物资4.5 查询防控宣传数据 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBoot…

Open CASCADE学习|保存为STL文件

STL (Stereolithography) 文件是一种广泛用于3D打印和计算机辅助设计 (CAD) 领域的文件格式。它描述了一个三维模型的表面而不包含颜色、材质或其他非几何信息。STL文件通常用于3D打印过程中&#xff0c;因为它们仅包含构建物体所需的位置信息。 由于STL文件只包含表面信息&am…

YOLOv8算法改进【NO.101】引入最新的损失函数Focaler-IoU

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 第一…

Days 27 ElfBoard 板 AltiumDesigner 相同电路快速布局布线

在进行设计开发的时候&#xff0c;总会遇到相同的电路&#xff0c;或者模块&#xff0c;这些电路可以使用相同的布局和走线&#xff0c;例如 DC-DC 电源、网口 PHY 电路部分。这类型的电路&#xff0c;我们可以采用AltiumDesigner 中的 Room 进行布局和布线的快速复制&#xff…

c语言数据类型定义错误导致的数据溢出或者死循环

数据溢出问题 #include <stdio.h>/* 数据溢出 */int main() {char i; // 数据表示范围[-128,127] 0xf0 ~ 0x7ffor(i0;i<130;i) // {printf("%d ",i);}return 0; }/* 编译运行上面的程序&#xff0c;你会发现程序陷入了死循环&#xff0c;一直在不断…

多模态知识图谱:感知与认知的交汇

目录 前言1 多模态知识图谱的概念1.1 感知系统与认知系统的连接1.2 信息形式的整合与融合1.3 全面、多维度的认知基础 2 多模态的作用2.1 模态的知识互补2.2 模态实体消歧2.3 模态语义搜索2.4 知识图谱补全2.5 多模态任务增强 3 多模态知识图谱发展历史3.1 初期模态数据整合3.2…

Vue源码系列讲解——虚拟DOM篇【四】(优化更新子节点)

目录 1. 前言 2. 优化策略介绍 3. 新前与旧前 4. 新后与旧后 5. 新后与旧前 6. 新前与旧后 7. 回到源码 8. 总结 1. 前言 在上一篇文章中&#xff0c;我们介绍了当新的VNode与旧的oldVNode都是元素节点并且都包含子节点时&#xff0c;Vue对子节点是 先外层循环newChil…

小游戏和GUI编程(5) | SVG图像格式简介

小游戏和GUI编程(5) | SVG图像格式简介 0. 问题 Q1: SVG 是什么的缩写&#xff1f;Q2: SVG 是一种图像格式吗&#xff1f;Q3: SVG 相对于其他图像格式的优点和缺点是什么&#xff1f;Q4: 哪些工具可以查看 SVG 图像&#xff1f;Q5: SVG 图像格式的规范是怎样的&#xff1f;Q6…

Python贝尔多项式

文章目录 Bell数和Bell多项式第二类Bell多项式 Bell数和Bell多项式 Bell&#xff0c;即所有包含 n n n个对象的有限集合的子集数之和&#xff0c;可通过递推式进行定义 B n ∑ k 0 n − 1 ( n − 1 k ) B k , B 0 1 B_n\sum^{n-1}_{k0}\begin{pmatrix} n-1\\k \end{pmatrix…