C语言处理文本模板:格式信函编程

开篇

本篇文章的问题来源为《编程珠玑》第3章其中一个问题,格式信函编程。说白了就是先在文件中定义一个文本模版,然后使用数据库中的数据去填充这个模版,最后得到填充后的文本,并输出。

问题概要

在常去的网店键入你的名字和密码并成功登录以后,弹出的下一页网页类似这样:
Welcome back,Jane!
We hope that you and all the members
of the Public family are constantly
reminding your neighbors there
on Maple Street to shop with us.
AS usual,we will ship your order to
Ms. Jane Q. public
600 Maple Street
Your Town, Iowa 12345

作为程序员,你会意识到隐藏在这一幕之后所发生的事情——计算机在数据库中查找你的用户名并返回如下所示的字段:
Public|Jane|Q|Ms.|600|Maple Street|Your Town|Iowa|12345

但是,程序如何依据你的个人数据库记录来构建这个定制的网页呢?急躁的程序员可能会试图按照下面所示的方式开始编写程序:
read lastname, firstname, init, title, streetnum,
streetname, tomn, state, zip
print “Welcome back,”,firstname, “!”
print “We hope that you and all the members”
print “of the”, lastname, “family are constantly”
print “reminding your neighbous there”
print “on”, streetname, "to shop with us. "
print “As usual, we will ship your order to”
print " ",title, firstname, init “.”, lastname
print " ", streetnum, streetname
print " ", town “,”, state, zip

一个更巧妙的方法是编写一个格式信函发生器(form letter generator)。该发生器基于下面所示的格式信函模板(form letter schema):
Welcome back, $1!
We hope that you and all the members
of the $0 family are constantly
reminding your neighbors there
on $5 to shop with us.
As usual, we will ship your order to
$3 $1 $2. $0
$4 $5
$6, $7 8... 符号 8 ... 符号 8...符号i代表记录中的第i个字段。于是, 0 代表姓,等等。模板使用下面的伪代码来解释。在伪代码中,文字符号 0代表姓,等等。模板使用下面的伪代码来解释。在伪代码中,文字符号 0代表姓,等等。模板使用下面的伪代码来解释。在伪代码中,文字符号在输入模板中记为$$。

read fields from database
loop from start to end of schema
c = next character in schema
if c ! =‘ ′ p r i n t c h a r c e l s e c = n e x t c h a r a c t e r i n s c h e m a c a s e c o f ′ ' printchar c else c = next character in schema case c of ' printcharcelsec=nextcharacterinschemacasecof’: printchar ‘$’
‘0’ - ‘9’: printstring field[c]
default: error(“bad schema”)

思路分析

上面的问题是书中的原文,简单来说就是,实现一个需求,可以将从后端取到的数据,填充到实现定义好的文本模版中。
这个问题的思路相对来说比较简单:

  1. 从文件中读取模版,判断是否为$
  2. 若不是 , 则直接输出;若为 ,则直接输出;若为 ,则直接输出;若为,则继续判断它的下一个字符,若它的下一个字符为数字,则以该数字为索引,取出对应数组中的元素,并输出
    所谓代码即语言,请直接看我的代码实现。

代码实现

模版内容

// t.txt
Welcome back, $1!
We hope that you and all the members
of the $0 family are constantly
reminding your neighbors there
on $5 to shop with us.
As usual, we will ship your order to$3 $1 $2. $0$4 $5 $6, $7 $8
...

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_LINE_LENGTH 1024int main() {// 模拟从数据库读取到的数据char* fields[] = {"Public", "Jane", "Q", "Ms.", "600", "Maple Street", "Your Town", "Iowa", "12345"};int i;// 打开文件FILE *file = fopen("t.txt", "r");if (!file) {perror("打开文件失败!");return EXIT_FAILURE;}char line[MAX_LINE_LENGTH];while (fgets(line, sizeof(line), file)) {size_t len = strlen(line);if (line[len - 1] == '\n') line[len - 1] = '\0';  // 去除换行符 for (i = 0; line[i] != '\0'; i++) {if (line[i] == '$') {i++;if (line[i] == '$') {printf("$");} else if (line[i] >= '0' && line[i] <= '9') {int index = line[i] - '0';if (index >= 0 && index < sizeof(fields)/sizeof(fields[0])) {printf("%s", fields[index]);} else {printf("error: 超出边界\n");return EXIT_FAILURE;}} else {fprintf(stderr, "error: 格式错误\n");return EXIT_FAILURE;}} else {putchar(line[i]);}}putchar('\n');}fclose(file);return EXIT_SUCCESS;
}

结果截图

结果截图

以上便是使用C语言实现格式信函编程的思路,希望对您能有所帮助!
因个人能力有限,若代码有任何谬误的地方,还请不吝指正!愿我们共同在IT之路上向前狂奔。
感谢阅读!

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

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

相关文章

Harmony鸿蒙南向驱动开发-SPI接口使用

功能简介 SPI指串行外设接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。SPI是由Motorola公司开发&#xff0c;用于在主设备和从设备之间进行通信。 SPI接口定义了操作SPI设备的通用方法集合…

页表缓存TLB原理

处理器的内存管理单元(Memory Management Uint&#xff0c;MMU)负责把虚拟地址转换成物理地址&#xff0c;为了加快虚拟地址到物理地址的转换速度&#xff0c;避免每次转换都需要查询内存中的页表&#xff0c;处理器厂商在MMU中增加了一个高速缓存TLB(Translation Lookaside Bu…

算法练习第16天|101. 对称二叉树

101. 对称二叉树 力扣链接https://leetcode.cn/problems/symmetric-tree/description/ 题目描述&#xff1a; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#x…

详解QActionGroup类的使用

QActionGroup 是 Qt 框架中用于管理一组相关 QAction 对象的类。它主要用于实现互斥选择&#xff08;即单选&#xff09;或多选&#xff08;即复选&#xff09;的行为&#xff0c;特别是在菜单、工具栏或上下文菜单中&#xff0c;当存在一系列相互排斥或相关联的操作选项时&…

【Python面试题收录】什么是堆?什么是栈?栈和堆的区别是什么?

一、堆和栈的定义 &#xff08;1&#xff09;堆&#xff08;Heap&#xff09; 数据结构&#xff1a;堆是一种特殊的完全二叉树&#xff0c;满足父节点的值总是大于或等于&#xff08;大根堆&#xff09;其子节点的值。也可以是总是小于或等于&#xff08;小根堆&#xff09;其…

品牌百度百科词条创建多少钱?

百度百科作为国内最具权威和影响力的知识型平台&#xff0c;吸引了无数品牌和企业争相入驻。一个品牌的百度百科词条&#xff0c;不仅是对品牌形象的一种提升&#xff0c;更是增加品牌曝光度、提高品牌知名度的重要途径。品牌百度百科词条创建多少钱&#xff0c;这成为了许多企…

玻璃生产线 Web 组态应用案例介绍

玻璃生产线组态可视化 概述 随着工厂信息化、数字化发展&#xff0c;智慧生产车间成为必然发展趋势&#xff0c;通过智能硬件、物联网、大数据等智慧化技术与手段&#xff0c;提高车间生产设备、工艺设备的智能执行能力&#xff0c;从而提升整个车间乃至工厂的智能化、网络化与…

【SpringBoot XSS存储漏洞 拦截器】Java纯后端对于前台输入值的拦截校验实现 一个类加一个注解结束

先看效果&#xff1a; 1.js注入拦截&#xff1a; 2.sql注入拦截 生效只需要两步&#xff1a; 1.创建Filter类&#xff0c;粘贴如下代码&#xff1a; package cn.你的包命.filter; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IO…

macos 查看 远程服务器是否开放某个端口

想要使用mac查看远程服务器某个端口是否开发&#xff0c;可通过 nc 命令&#xff0c;如下&#xff1a; nc -zv <服务器IP> <端口号>如果该端口开发&#xff0c;结果为&#xff1a;succeeded! Connection to <服务器IP> port <端口号> [类型] succeed…

CLion 2024:为Mac与Win打造的卓越跨平台集成开发环境

CLion 2024作为一款跨平台IDE&#xff0c;CLion 2024不仅完美支持Mac和Windows两大操作系统&#xff0c;更在细节之处展现了其出色的跨平台兼容性。无论你是在Mac的优雅界面下工作&#xff0c;还是在Windows的实用环境中编程&#xff0c;CLion 2024都能为你提供一致且流畅的开发…

Day98:云上攻防-云原生篇K8s安全Config泄漏Etcd存储Dashboard鉴权Proxy暴露

目录 云原生-K8s安全-etcd(Master-数据库)未授权访问 etcdV2版本利用 etcdV3版本利用 云原生-K8s安全-Dashboard(Master-web面板)未授权访问 云原生-K8s安全-Configfile鉴权文件泄漏 云原生-K8s安全-Kubectl Proxy不安全配置 知识点&#xff1a; 1、云原生-K8s安全-etcd未…

对SQL主键优化策略收录

1. 主键选择 类型选择&#xff1a;主键应当尽可能短小且高效。通常推荐使用整数类型&#xff08;如INT或更小的SMALLINT、TINYINT&#xff09;&#xff0c;尤其是带有自增属性&#xff08;AUTO_INCREMENT&#xff09;的整数&#xff0c;这样既能保证唯一性&#xff0c;又能减少…

Springboot实现链路追踪功能

前言 在日常开发中&#xff0c;一个业务的实现往往会调用很多个方法&#xff0c;当我们去看日志的时候&#xff0c;各种接口的日志打印出来&#xff0c;看着就头疼&#xff0c;压根没办法去定位&#xff0c;而链路追踪就能很好的帮助我们去查看接口从头至尾依次调用了哪些方法…

vue小程序跳转页面携带参数

跳转携带对象 前一个页面&#xff1a;跳转的方法里把数组转成字符串 gotoArea(item){console.log("item",item)let datas JSON.stringify(item);goto.goto(navigateTo,index/area/main?itemdatas);},跳转的目标页面&#xff1a; onLoad(options){let datas JSO…

MacOS13搭建安卓逆向环境

MacOS中用apktool解包 这里是所有链接&#xff1a;123云盘下载 https://www.123pan.com/s/9QRqVv-JE7Y.html安装apktool https://apktool.org/docs/install/ 或者下载单独的jar包 brew install wgethttps://apktool.org/blog/apktool-2.9.3下载直链&#xff1a;https://co…

ChatGPT让论文写作更高效,让学术研究更精彩

ChatGPT无限次数:点击直达 ChatGPT让论文写作更高效&#xff0c;让学术研究更精彩 引言 在当今数字化时代&#xff0c;人工智能技术的发展为学术研究者提供了更多创新的机会和工具。其中&#xff0c;自然语言处理模型如ChatGPT在论文写作领域展现出强大的潜力。本文将介绍如何…

数据仓库—大数据建模

大数据建模是一个关键的环节&#xff0c;它直接影响到数据仓库的设计和运行效果。下面将详细介绍一下大数据建模的一般步骤和关键概念。 建模步骤 需求分析&#xff1a;首先要对业务需求进行深入分析&#xff0c;了解业务的核心目标和数据分析的重点。只有明确了需求&#xff…

spring的事件推送

本质上是设计模式中的观察者模式。 一、什么是观察者模式 观察者模式是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;其所有依赖者都会收到通知并自动更新。 二、什么是spring的事件推送 在 Spring 的事…

使用Python批量将PDF转Word

简述 以下全部代码无法完美对图片、表格等非文字形式的内容转化。要较好的效果需要使用光学字符分析等方法进行转化 我懒&#xff0c;不想将代码模块拆分出来写注释 除代码1中有详细注释外&#xff0c;剩下的代码仅在关键部分进行注释 代码1&#xff1a;小规模文件的转换 代码…

TikTok如何矩阵养号?TK防关联引流系统助力TK账号安全运营

TK是 TikTok旗下的短视频社交媒体&#xff0c;平台目前是全球最火的短视频平台&#xff0c;目前全球活跃用户已经超过8亿。其中 TikTok的用户已经达到8亿。TK这款短视频社交媒体平台在海外的发展潜力非常大&#xff0c;也是国内很多人的创业目标&#xff0c;很多人都想从 TK这个…