C语言KR圣经笔记 7.7行输入和输出 7.8其他函数

7.7 行输入和输出

标准库提供了一个输入例程 fgets,类似于我们在之前章节使用过的 getline 函数:

char *fgets(char *line, int maxline, FILE *fp)

fgets 从文件 fp 中读取下一个输入行(包括换行符)到字符数组 line 中;最多读入 maxline-1 个字符。结果行以 '\0' 结尾。 fgets 通常返回 line;若遇到文件结束或错误则返回 NULL。(我们的getline 返回行的长度,这个返回值更有用;若文件结束则返回 0。)

至于输出, 有 fputs 函数写一个字符串(不必包含换行符)到文件中:

int fputs(char *line, FILE *fp)

如果遇到错误会返回EOF,否则返回 0。

库函数 gets 和 puts 类似 fgets 和 fputs,不过操作的是 stdin 和 stdout。令人困惑的是,gets 删除结尾的 '\n',而 puts 在结尾添加 '\n'。

为了说明 fgets 和 fputs 这样的函数也没什么特别的,这里把它们源代码从我们系统的标准库中拷贝出来,给大家看看:

/* fgets: 从 iop 中获取最多 n 个字符 */
char *fgets(char *s, int n, FILE *iop)
{register int c;register char *cs;cs = s;while (--n > 0 && (c = getc(iop)) != EOF)if ((*cs++ = c) == '\n')break;*cs = '\0';return (c == EOF && cs == s) ? NULL : s;
}/* fputs: 写字符串到文件iop */
int fputs(char *s, FILE *iop)
{int c;while (c = *s++)putc(c, iop);return ferror(iop) ? EOF : 0;
}

标准库规定 ferror 在错误时返回非零;fputs 在错误时返回 EOF,其他情况下返回非负数。

可以很容易用 fgets 来实现我们的 getline:

/* getline:读一行,返回长度 */
int getline(char *line, int max)
{if (fgets(line, max, stdin) == NULL)return 0;elsereturn strlen(line);
}

练习7-6、写个程序来比较两个文件,打印出它们的第一个差异行。
练习7-7、修改第五章的样式搜索程序,使其从一系列文件中获取输入,如果没有给出文件名做参数,则用标准输入。当找到匹配行时,是否应当输出文件名?
练习7-8、写个程序打印一系列文件,每个文件从新的一页开始,带标题和页码。

7.8 其他函数

标准库提供了种类繁多的函数。本节是对其中最常用部分的概述。更多的细节和更多其他函数,参见附录B。


7.8.1 字符串操作


我们已经提到过 <string.h> 中的字符串函数 strlen, strcpy, strcat 和 strcmp 。在下面的描述中, s 和 t 是 char * 类型,而 c 和 n 是 int 类型。

strcat(s,t)             连接 t 到 s 的末尾
strncat(s,t,n)        连接 t 的 n 个字符到 s 的末尾
strcmp(s,t)           在 s < t ,s == t 或 s > t 时分别返回负数,0 和 正数 
strncmp(s,t,n)      与 strcmp 一样,但只比较前 n 个 字符
strcpy(s,t)             把 t  拷贝到 s
strncpy(s,t,n)        最多拷贝 t 的 n 个字符到 s
strlen(s)                返回 s 的长度
strchr(s,c)             返回 s 中第一个 c 的指针,若没有则返回 NULL
strtchr(s,c)            返回 s 中最后一个 c 的指针,若没有则返回 NULL


7.8.2 字符类型判断和转换


一些来自 <ctype.h>的函数执行字符判断和转换。在下面的描述中,c 是可以表示为 unsigned char 或 EOF 的一个 int。这些函数返回 int。

isalpha(c)        若 c 为字母则返回非0,否则返回0
isupper(c)        若 c 为大写则返回非0,否则返回0
islower(c)         若 c 为小写则返回非0,否则返回0
isdigit(c)           若 c 为数字则返回非0,否则返回0
isalnum(c)        若 isalpha(c) 或 isdigit(c) 则返回非0,否则返回0
isspace(c)        若 c 为空格、制表符、换行符、回车符、换页符、垂直制表符则返回非0
toupper(c)        返回转换成大写后的 c
tolower(c)         返回转换成小写后的 c


7.8.3 ungetc

我们在第四章写过 ungetch 函数,标准库提供了一个更加受限的版本;称为 ungetc

int ungetc(int c, FILE *fp)

将字符 c 推回给文件 fp 并返回 c,或遇到错误则返回 EOF。每个文件只保证推回一个字符。ungetc 能够与任意输入函数如 scanf,getc 或 getchar 一起使用。

7.8.4 命令执行


system(char *s) 函数执行字符串 s 中的命令,然后继续当前程序的执行。s 的内容强依赖于本地系统。举个UNIX系统上的小例子,如下语句

system("date");


使程序 date 被执行;它在标准输出上打印日期和时间。 system 从被执行的命令中返回一个依赖于系统的整数。在 UNIX 系统中,返回的状态是 exit 返回的值。

7.8.5 内存管理

函数 malloc 和 calloc 动态地获取内存块。

void *malloc(size_t n)

返回一个指针,指向 n 个字节的未初始化的内存空间,若无法满足要求则返回 NULL。

void *calloc(size_t n, size_t size)

返回一个指针,指向能容纳 n 个指定大小为 size 的对象的数组空间,若无法满足要求则返回 NULL。内存空间初始化为零。

malloc 和 calloc 返回的指针为所需的对象提供了正确的对齐,但必须要转换成恰当的类型,例如

int *ip;ip = (int *) calloc(n, sizeof(int));

free(p) 释放 p 指向的内存空间,其中 p 最初是通过调用 malloc 或 calloc 得到的。空间的释放顺序是随意的,但释放并非由调用 calloc 或 malloc 得到的内存是非常可怕的错误。

在内存释放后继续使用也是错误的。下面这段在链表中循环释放元素的代码非常典型,但却是错误的:

for (p = head; p != NULL; p = p->next)     /* 错误 */free(p);

 
正确的方法是在释放之前保存需要的内容

for (p = head; p != NULL; p = q) {q = p->next;free(p);
}

8.7 给出了一个类似 malloc 的内存管理器的实现,其中分配的内存块可以自由地以任意顺序释放。

7.8.6 数学函数

<math.h> 中定义了超过 20 个数学函数;这里给出一些使用最频繁的。每个函数都要一个或两个double 参数,并返回 double。

sin(x)                x 的正弦,x 为弧度
cos(x)               x 的余弦,x 为弧度
atan2(y,x)         y/2 的反正切,xy为弧度
exp(x)               e 的 x 次方
log(x)                x 的自然对数(x > 0)
log10(x)            x 的常用对数(x > 0)
pow(x,y)            x 的 y 次方
sqrt(x)                x 的平方根( x >= 0)
fabs(x)               x 的绝对值


7.8.7 随机数生成

函数 rand 计算出范围从 0 到 RAND_MAX(在<stdlib.h>中定义)的伪随机整数序列。生成大等于0但小于1的伪随机浮点数的一种方法是

#define frand() ((double) rand() / (RAND_MAX + 1.0))

(如果你的库已经提供了获取浮点随机数的函数,则它可能比上面这个有更好的统计特性。)

函数 srand(unsigned) 设置 rand 的种子。标准建议的可移植的 rand 和 srand 的实现,参见 2.7节。


练习7-9、像 isupper 这样的函数可以实现为节省空间或节省时间。探索两种可能性。


(第七章完)
 

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

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

相关文章

AOSP10 替换系统launcher

本文实现将原生的launcher 移除&#xff0c;替换成我们自己写的launcher。 分以下几个步骤&#xff1a; 一、新建一个自己的launcher项目。 1.直接使用android studio 新建一个项目。 2.修改AndroidManifest.xml <applicationandroid:persistent"true"androi…

【Linux 内核源码分析】内存管理——Slab 分配器

Slab 分配器 在Linux内核中&#xff0c;伙伴分配器是一种内存管理方式&#xff0c;以页为单位进行内存的管理和分配。但是在内核中&#xff0c;经常会面临结构体内存分配问题&#xff0c;而这些结构体的大小通常是小于一页的。如果使用伙伴分配器来分配这些小内存&#xff0c;…

xxl-job架构原理讲解

1、调度中心 调度中心是一个单独的Web服务&#xff0c;主要是用来触发定时任务的执行 它提供了一些页面操作&#xff0c;我们可以很方便地去管理这些定时任务的触发逻辑 调度中心依赖数据库&#xff0c;所以数据都是存在数据库中的 调度中心也支持集群模式&#xff0c;但是…

mybatis数据操作语句

//基于注解 Mapper public interface reboudapt {Select("select * from dept")List<dept> huoqudept();//删除语句Delete("delete from dept where id #{id}")void deletesc(Integer id);//增加语句Insert("insert into dept(name, create_t…

Docker镜像加速

前言 众所周知&#xff0c;我们常用的一些工具或系统的下载源都是国外的&#xff0c;这就会导致我们在下载一些东西时&#xff0c;会导致下载巨慢或者下载失败的情况&#xff0c;下面便是docker换下载源的教程 镜像加速 下面是几个常用的国内的镜像 科大镜像&#xff1a;ht…

LeetCode每日一题 同构字符串(哈希表)

题目描述 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。每个出现的字符都应当映射到另一个字符&#xff0c;同时不改变字符的顺序。不同字符不能映射到同一个字符上&#xf…

transformer,视觉模型改进论文的讨论

1、efficientVIT efficientformer 模型 快48.9倍的新SAM&#xff01;清华&MIT&英伟达开源EfficientViT-SAM&#xff1a;精度不变&#xff0c;原地起飞 YOLOv8改进 | 2023主干篇 | EfficientViT替换Backbone&#xff08;高效的视觉变换网络&#xff09; - Snu77的文章 -…

BTC系列-系统学习铭文(一)-比特币上的NFT

Ordinals协议概况 开源项目: https://github.com/ordinals/ord铭文浏览器: https://Ordinals.com关于Ordinals的BIP: https://github.com/ordinals/ord/blob/master/bip.mediawiki序数理论手册: https://docs.ordinals.com/overview.html 所需的技术积累 Ordinals NFTs 是基…

容器库(10)-std::unordered_set

unordered_set是以key为元素无序的关联容器&#xff0c;搜索、移除和插入操作是平均常数的时间复杂度。unordered_set在内部没有按任何顺序排列&#xff0c;而是放在桶当中的&#xff0c;放进哪个桶是通过计算key的hash值来决定的。 template<class Key,class Hash std::h…

Wireshark过滤DNS协议包语法实战

背景 现网DNS服务器发现CPU突增&#xff0c;发现有可能是客户恶意发起的随机子域名扫描&#xff0c;对服务器进行抓包分析&#xff0c;记录下当时的操作。 抓包 执行命令 tcpdump -iany port 53 and host $ip -nnv -w $ip.pcap进行抓包导出到本地&#xff0c;使用Wireshark进…

人工智能|深度学习——基于数字图像处理和深度学习的车牌定位

1.研究背景及研究目的和意义 车牌识别Vehicle License Plate Recognition VLPR) 是从一张或一系列数字图片中自动定位车牌区域并提取车牌信息的图像识别技术。车牌识别 以数字图像处理、模式识别、计算机视觉等技术为基础&#xff0c;是现代智能交通系统的重要组成部分&#xf…

前端项目docker部署

以react项目为例&#xff0c;理论上vue项目也支持。 打包。最好在package.json 里加上"homepage": "."&#xff0c;打包好后&#xff0c;会生成build目录将build目录下的所有文件上传到服务器&#xff0c;假设放在/root/service/shop-h5/public 目录下编写…

C#知识点-16(计算器插件开发、事件、递归、XML)

计算器插件开发 1、Calculator.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Calculator_DLL {//用来明确所有插件开发人员的开发规范public abstract class Calculator{public int N…

2024-02-21 算法: 测试链表是否有环

点击 <C 语言编程核心突破> 快速C语言入门 算法: 测试链表是否有环 前言一、双指针 ( 快慢指针 )二、代码总结 前言 要解决问题: 一道简单的算法题, 测试链表是否含有环. 想到的思路: 哈希表, 将链表指针强制转换为整型, 利用求余法建立哈希函数. 太复杂, 内存效率不高…

MyBatis的注解式开发

MyBatis的注解式开发 一、准备开发环境1.添加依赖2.jdbc.properties3.mybatis-config.xml4.Article实体类5.SqlSessionUtil工具类 二、Insert三、Delete四、Update五、Select mybatis 中也提供了注解式开发⽅式&#xff0c;采⽤注解可以减少 Sql 映射⽂件的配置。使⽤注解式开发…

设计模式浅析(六) ·命令模式

设计模式浅析(六) 命令模式 日常叨逼叨 java设计模式浅析&#xff0c;如果觉得对你有帮助&#xff0c;记得一键三连&#xff0c;谢谢各位观众老爷&#x1f601;&#x1f601; 命令模式 概念 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c…

YOLOv5代码解读[02] models/yolov5l.yaml文件解析

文章目录 YOLOv5代码解读[02] models/yolov5l.yaml文件解析yolov5l.yaml文件检测头1--->耦合头检测头2--->解耦头检测头3--->ASFF检测头Model类解析parse_model函数 YOLOv5代码解读[02] models/yolov5l.yaml文件解析 yolov5l.yaml文件 # YOLOv5 &#x1f680; by Ult…

FPGA SERDESE2 (SDR收发仿真)

高速 Serdes 环路测试 高速串行通信优势非常巨大,只需要很少的IO引脚就可以实现高速通信,这也是当今FPGA高速接口的核心 技术。比如XILINX的7代FPGA,GTX可以达到10.3125Gbps,ultrascale FPGA的GTH可以达到16Gbps。目前国产FPGA还难以达到这么高的接口速度。 高速串行通信经…

社区分享|中华保险基于MeterSphere开展接口自动化测试

中华联合保险集团股份有限公司&#xff08;以下简称为“中华保险”&#xff09;始创于1986年&#xff0c;是全国唯一一家以“中华”冠名的国有控股保险公司。截至2022年12月底&#xff0c;中华保险总资产为1006.06亿元&#xff0c;在全国拥有超过2900个营业网点&#xff0c;员工…

Servlet中的请求与响应

Request和Response 1.Request和Response的概述2.Request对象2.1 Request继承体系2.2 Request获取请求数据2.3 解决post请求乱码问题 *2.4 Request请求转发(-&#xff0c;*)2.5 request的生命周期 3.HTTP响应详解(理解)1.使用抓包查看响应报文协议内容2.HTTP响应报文协议介绍 4.…