源码阅读: echo 回显程序

文章目录

    • 1. 目的
    • 2. 原始代码
    • 3. 化简和跨平台支持
    • 4. 修改后代码的代码分析
    • 5. References

在这里插入图片描述

1. 目的

阅读 netbsd 9.3 的 echo.c, 练习 C 语言源码阅读的技能。

2. 原始代码

https://github.com/NetBSD/src/blob/trunk/bin/echo/echo.c

/* $NetBSD: echo.c,v 1.23 2021/11/16 21:38:29 rillig Exp $	*//** Copyright (c) 1989, 1993*	The Regents of the University of California.  All rights reserved.** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions* are met:* 1. Redistributions of source code must retain the above copyright*    notice, this list of conditions and the following disclaimer.* 2. Redistributions in binary form must reproduce the above copyright*    notice, this list of conditions and the following disclaimer in the*    documentation and/or other materials provided with the distribution.* 3. Neither the name of the University nor the names of its contributors*    may be used to endorse or promote products derived from this software*    without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF* SUCH DAMAGE.*/#include <sys/cdefs.h>
__COPYRIGHT(
"@(#) Copyright (c) 1989, 1993\The Regents of the University of California.  All rights reserved.");#if 0
static char sccsid[] = "@(#)echo.c	8.1 (Berkeley) 5/31/93";
#else
__RCSID("$NetBSD: echo.c,v 1.23 2021/11/16 21:38:29 rillig Exp $");
#endif#include <err.h>
#include <locale.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>/* ARGSUSED */
int
main(int argc, char *argv[])
{bool nflag;setprogname(argv[0]);(void)setlocale(LC_ALL, "");/* This utility may NOT do getopt(3) option parsing. */nflag = *++argv != NULL && strcmp(*argv, "-n") == 0;if (nflag)++argv;while (*argv != NULL) {(void)printf("%s", *argv);if (*++argv != NULL)(void)putchar(' ');}if (!nflag)(void)putchar('\n');(void)fflush(stdout);if (ferror(stdout) != 0)err(1, "write error");return 0;
}

3. 化简和跨平台支持

删除头部版权信息的文本。

err.h 在 MSVC 编译器下不存在,err() 改为 fprintf().

使用 clang-format 修改了编码风格:

BasedOnStyle: Microsoft
IndentWidth: 4

修改后的完整代码:

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(int argc, char *argv[])
{bool nflag;// detect "-n" optionnflag = *++argv != NULL && strcmp(*argv, "-n") == 0;if (nflag)++argv;while (*argv != NULL){printf("%s", *argv);if (*++argv != NULL){putchar(' ');}}if (!nflag){putchar('\n');}fflush(stdout);if (ferror(stdout) != 0){fprintf(stderr, "write error");}return 0;
}

4. 修改后代码的代码分析

检查是否传入了 -n 参数:
在这里插入图片描述
其中 *++argv 表示, 先让 argv = argv + 1, 再取*argv.

原样输出每个输入的字符: 如果不是最后一个字符, 则跟随输出一个空格:
在这里插入图片描述

如果输入了 -n 选项, 那么主动输出一个换行符:
在这里插入图片描述
刷新io的缓冲区,立即输出到屏幕上。如果输出出现了错误,输出到标准错误输出上:
在这里插入图片描述

5. References

  • Cannot open source file err.h in visual studio?

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

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

相关文章

第G1周:生成对抗网络(GAN)入门

目录 一、课题背景和开发环境二、理论基础1.生成器2. 判别器3. 基本原理 三、前期准备工作1. 定义超参数2.下载数据3. 配置数据 四、定义模型1. 定义鉴别器2. 定义生成器 五、训练模型1. 创建实例2. 训练模型3. 保存模型 &#x1f368; 本文为&#x1f517;365天深度学习训练营…

举例说明什么是基于线性回归的单层神经网络

基于线性回归的单层神经网络是一种简单的神经网络&#xff0c;通常用于解决回归问题。这种神经网络只包含一个输入层和一个输出层&#xff0c;没有隐藏层。我们可以通过求解权重和偏置项来拟合输入和输出之间的线性关系。 例如&#xff0c;给定一个数据集&#xff0c;其中包含了…

面试题更新之-使用 base64 编码的优缺点

文章目录 base64 编码是什么&#xff1f;使用 base64 编码的优缺点 base64 编码是什么&#xff1f; Base64编码是一种将二进制数据转换为ASCII字符的编码方式。它将三个字节的二进制数据分割成四组&#xff0c;每组6个比特&#xff0c;然后将这些6个比特转换为可打印的ASCII字…

使用Hugging Face预训练Bert处理下游任务显存占用过多

在使用HuggingFace的transformer下的BertForMaskedLM进行预训练语言模型的load时&#xff0c;bert会占用很大的显存。 这里可以考虑使用TinyBERT&#xff0c;速度和显存上都能得到很大的优化。 具体的方法进入https://huggingface.co/huawei-noah/TinyBERT_General_4L_312D/tr…

前端(五)——从 Vue.js 到 UniApp:开启一次全新的跨平台开发之旅

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;从 Vue.js 到 UniApp&#xff1a;开启一次全新的跨平台开发之旅 文章目录 UniApp和vue.js什么是UniApp&#xff1f;UniApp的写法什么是vue.js&#xff1f;UniApp与vue.js是什么关系&#xff1f; 为什…

选择排序算法介绍

算法介绍 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的基本思想是每次从待排序的元素中选取最小&#xff08;或最大&#xff09;的元素&#xff0c;放到已排序部分的末尾&#xff0c;直到全部元素排序完毕。 以下是选择排序的详细步骤&…

10.5.2 【Linux】命令执行的判断依据, ,||

cmd ; cmd &#xff08;不考虑指令相关性的连续指令下达&#xff09; 在某些时候&#xff0c;我们希望可以一次执行多个指令&#xff0c;例如在关机的时候我希望可以先执行两次sync 同步化写入磁盘后才 shutdown 计算机&#xff0c;那么可以这样作&#xff1a; [rootstudy ~]…

实现一个vscode插件:打开多个vscode项目时根据.nvmrc文件自动切换nvm

开发背景与最终功能 需要维护一些老项目&#xff0c;同时开发新项目时&#xff0c;切换nvm很烦人 最终实现vscode插件&#xff1a;每个vscode实例打开一个项目&#xff0c;切换vscode实例时能自动切换版本&#xff08;需要项目根目录有一个.nvmrc文件&#xff09; 插件下载 …

数学建模———层次分析法及其matlab语法,函数和代码实现

层次分析法思想登场 建模比赛中最基础的模型之一&#xff0c;其主要用于解决评价类问题&#xff08;例如&#xff1a;选择那种方案最好&#xff0c;哪位运动员或者员工表现的更优秀。&#xff09; 评价类问题字眼&#xff1a; 评价的目标是什么&#xff1f;达到这个目标有那…

【已解决】JavaScript为控件绑定事件死活不生效

本博文源于最近操作的JavaScript一个诡异的事情。我在用js一个动态生成的按钮&#xff0c;然后想要为其绑定一个alert的事件&#xff0c;结果发现控制台给我报未定义的错误&#xff0c;我慌的不要要的&#xff0c;经过长时间胡乱尝试终于解决了。 问题再现 dataHtml "&…

uniapp 打包安卓apk (原生App)云打包

uniapp 打包安卓apk (原生App)云打包 hbuilder中操作 项目的一些配置appid DCloud appid 用途/作用/使用说明&#xff1a; https://ask.dcloud.net.cn/article/35907 右键我们项目目录-》发行-》原生APP-云打包 说明&#xff1a; 1. 打包安卓&#xff0c;只选择安卓打包项&…

【Redis】—— Redis的RDB持久化机制

&#x1f4a7; 【 R e d i s 】—— R e d i s 的 R D B 持久化机制 \color{#FF1493}{【Redis】 —— Redis的RDB持久化机制} 【Redis】——Redis的RDB持久化机制&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞…