特殊的转义字符—— \b 退格字符 ASCII 08

news2024/10/5 18:33:11

引入

我们在写 C 语言题目时,经常会碰见这样的输出

1=1
1+2=3
1+2+3=6
1+2+3+4=10

如果用循环的话,这个加号是个大问题,如果直接用 printf("%d+"),最后会多一个加号,用 printf("+%d") 则前面会多一个加号。想要解决,则必须判断当前输出的是否为第一个或者最后一个数字,如果是,就不用输出加号。

新思路

有人就发现了,转义字符里有一个\b,这是个退格字符,能不能用它把多余的加号给删了呢?
那就试试呗,先输出个从 1 加到 5 试试

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int sum = 0;
	for (int i = 1; i <= 5; i++)
	{
		printf("%d+", i);
		sum += i;
	}
	printf("\b");
	printf("=%d\n", sum);
	return 0;
}

好像没什么毛病,对吧?
在这里插入图片描述
让我们再提交到判题平台上试试
在这里插入图片描述
加号居然没删掉,而且还多了个点出来!

真实含义

我们把上面的代码稍稍改动一下

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int sum = 0;
	for (int i = 1; i <= 5; i++)
	{
		printf("%d+", i);
		sum += i;
	}
	printf("\b");
	//printf("=%d\n", sum); //<---- 注释这一行
	return 0;
}

运行效果:
在这里插入图片描述
这段代码和上面的一模一样,只是把等号后面的输出给删掉了而已。**但是,最后的加号居然神奇地又出现了!**这是为什么呢?

我们先来看一下“退格”究竟为何含义。
\b 字符的确是退格字符,但此退格非彼退格,可不是键盘上的退格键。\b 这个退格就是字面含义上的退格,即“往前退一格”。
也就是说,一个单独的 \b 并不能删除上一个字符,他只是把光标往前移了一下而已。

那开头的代码为什么能正常输出呢?很简单,因为后面输出的字符覆盖掉了前面的字符,因此看起来好像是把上一个字符给删了。
为了更清晰的表示这个过程,我做了一个动图。(偷一下懒,图里只制作了三个数字求和,但原理是一样的。)
在这里插入图片描述
事实上退格键在早期打印机上的作用就是“往前退一格”,后来退格键的含义变了,变成了“往前退一格 + 删除一个字符”。

实际输出与显示

问题还没有完全解决:为什么在本地可以,但是上传到判题平台就不行了呢?
因为“显示的内容 ≠ 输出的内容”

请看以下代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	printf("123\n");
	printf("123\b\n");
	printf("123\b4\n");
	return 0;
}

运行结果
在这里插入图片描述

然而,我们把它编译,然后把程序的输出结果重定向到文件里,得到的结果是这样的:

123
123
1234

这段输出在不同的地方显示的内容可能不相同
Windows 记事本:一个框

Visual Studio 2015:啥也没有
在这里插入图片描述
Visual Studio 2019:一个带空心圈的实心框
![[Pasted image 20221125225938.png]]
Sublime:
![[Pasted image 20221125230132.png]]
**可以看到我们的 \b 字符,也就是 ASCII 码 0x8 的字符被原样输出了出来,**在文本编辑器里并没有实现退格的效果。判题平台上使用的就是类似的方法,把程序的输出直接导出,传到网站上显示,但浏览器可不认 \b,于是就显示为了一个红点。

实际应用

利用这个退格字符,我们可以做一个进度条出来
第一种:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main()
{
	int index = 0;
	char ch[] = {'|', '\\', '-', '/'};
	while (1)
	{
		putchar(ch[index]);

		index++;
		if (index >= 4)
			index = 0;

		Sleep(200); // Sleep(200) 的作用是延时 200 毫秒(0.2 秒)再继续执行下面的代码
		putchar('\b');
	}
	return 0;
}

演示
在这里插入图片描述

第二种:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main()
{
	//假设要做一个耗时较长的操作
	//为了更好的用户体验,我们需要一个进度条
	
	double progress = 0.1; //当前进度
	int length = 15; //进度条字符长度

	for (progress = 0.1; progress <= 1; progress += 0.05)
	{
		//先输出 length 个 \b,把光标倒到开头去
		for (int j = 0; j < length + 2; j++)
			putchar('\b');

		putchar('[');
		//已经完成部分的进度条
		int count = (int)(length * progress); 
		for (int j = 0; j < count; j++)
			putchar('#');
		//未完成部分的进度条
		for (int j = 0; j < length - count; j++)
			putchar(' ');
		putchar(']');
		
		Sleep(100);
	}
	return 0;
}

演示
在这里插入图片描述

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

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

相关文章

Qt编写视频监控管理平台(支持海康/大华/宇视/华为/天地伟业/H264/H265等)

一、前言 海康大华等厂家自己的客户端软件&#xff0c;基本上都是支持自家的设备&#xff0c;不支持其他家的摄像机和硬盘录像机&#xff0c;并不是因为技术上做不到&#xff0c;这些大厂要实现支持兼容其他的家的&#xff08;他们家的服务端或者收费的都是支持其他家的&#…

写个rpc调用,试试自己了解多少

什么是rpc rpc即是远程过程调用&#xff0c;简单来说就是调用其他服务的接口像调用自己的本地方法一样&#xff0c;通常我们的调用的时候不需要关心调用过程和底层的通信即可实现调用其他的服务&#xff1b; 大概流程就是服务模块双方都会向注册中心注册自己的服务&#xff0c…

开发工具vim

一、开发工具vim vim的安装&#xff1a;yum install -y vim 指令&#xff1a;vim --version可以查看当前的版本信息&#xff0c;没有弹出信息就是没有安装。 装的vim是没有相关配置文件的&#xff0c;配置文件需要后面自己装。 之前说过&#xff0c;vs2019是集成软件编译…

【畅购商城】购物车模块之修改购物车以及结算

目录 购物车操作&#xff1a;修改 分析 接口 后端实现&#xff1a;更新 前端实现&#xff1a;修改 前端实现&#xff1a;全选 后端实现&#xff1a;删除数据 结算 跳转页面 购物车操作&#xff1a;修改 分析 接口 PUT http://localhost:10010/cart-service/carts 后…

python数学基础——单词统计

这个练习使用的是英文的单词统计&#xff0c;使用split通过单词中间的空格来做区分&#xff0c;在遍历的过程中通过对【字典】类型进行【字典推导式】的处理来计算每个单词出现的频次。但是由于过程中我们通过re的正则表达式来替换掉了很多的符号&#xff0c;并没有替换成空&am…

【网页设计】web前端期末大作业html+css

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Day12--自定义组件-渲染my-search组件的基本结构

1.自定义搜索组件 我的操作&#xff1a; 1》在uni_modules中右键新建uni_modules插件&#xff1a; 2》看看效果图&#xff1a; ************************************************************************************************************** 2.在分类页面的 UI 结构中&…

工作中常用的设计模式--策略模式

一般做业务开发&#xff0c;不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为Java&#xff0c;基于Spring框架。 1 策略模式(Strategy Pattern) 一个类的行为或方法&#xff0c;在运行时可以根据条件的不同&#xff0c;有不同的…

verilog练习——基础语法

目录 基础语法 VL1 四选一多路器 VL2 异步复位的串联T触发器 VL3 奇偶校验 VL4 移位运算与乘法 VL5 位拆分与运算 VL6 多功能数据处理器 VL7 求两个数的差值 VL8 使用generate…for语句简化代码 VL9 使用子模块实现三输入数的大小比较 VL10 使用函数实现数据大小端转…

数据结构题目收录(二十五)

1、排序趟数与序列的原始状态无关的排序方法是&#xff08;&#xff09;。 Ⅰ、直接插入排序 Ⅱ、简单选择排序 Ⅲ、冒泡排序 Ⅳ、基数排序 A&#xff1a;Ⅰ、ⅢB&#xff1a;Ⅰ、Ⅱ、ⅣC&#xff1a;Ⅰ、Ⅱ、ⅢD&#xff1a;Ⅰ、Ⅳ 解析 交换类的排序&#xff0c;其趟数和…

GUI编程--PyQt5--QDiaglog

文章目录QDialogQFontDialogQColorDialogQFileDialogQInputDialogQDialog 对话框基类&#xff0c;继承QWidget&#xff1b;用于短期任务&#xff0c;分为模态、非模态 模态&#xff0c;阻塞在当前窗口&#xff1b;分为应用程序级别&窗口级别&#xff08;仅阻塞关联的窗口&…

关于使用鼠标时间mouseMove拖拽元素及元素抖动的解决方案

最近在做一个画布相关的项目时有一个场景是移动画布&#xff0c;最先开始想到的是拖拽事件&#xff0c;但是用户希望元素是实时的变化&#xff0c;所以决定使用mouseMove事件来做。 思路 通过mouseDown事件确定鼠标按下的位置根据mouseMove事件来计算出鼠标相对初始状态的横向…

MySQL锁杂谈

【说明】 1.MySQL版本5.7.37 2.事务隔离级别 REPEATABLE-READ 3.表结构 Create Table: CREATE TABLE isolation_innodb (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(10) DEFAULT NULL,money int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT4…

jsp库存管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 库存管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开 发&#xff0c;数据库为Mysql&#xff0c;使用ja…

VMware Cloud Director数据库操作

VMware Cloud Director 是一个云服务平台&#xff0c;以自助服务模式提供安全、隔离、弹性的虚拟数据中心计算、网络、存储和安全。在NFV整个架构中属于VIM层&#xff0c;与NFVI层&#xff08;对VMware来说即vSphere虚拟化环境&#xff09;对接获取虚拟化资源并提供给租户。 NF…

服务访问质量(QoS)——QoS技术概述与配置

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.QoS技术概述 1.QoS的应用需求 ①网络拥塞的影响&#xff1a…

【Linux】项目自动化构建工具:make/Makefile的使用

文章目录一、背景1、make和makefile是什么&#xff1f;2、为什么要使用make和makefile?二、原理1、使用make和makefile2、依赖关系和依赖方法3、具体原理4、项目清理一、背景 1、make和makefile是什么&#xff1f; make是一个命令&#xff0c;是一个解释makefile中指令的命令…

Linux项目:自主web服务器

文章目录项目描述Web与 http 发展史DNSURI URL URNHTTP 概述项目纲要项目架构套接字的封装HTTP服务启动日志信息与工具类请求、响应类读取请求读取请求行读取请求报头分析请求行分析请求报头读取正文构建响应预处理返回静态网页CGI机制CGI机制的基本概念CGI函数的实现子CGI程序…

【点云处理】点云法向量估计及其加速(4)

上篇文章【点云处理】点云法向量估计及其加速(3)介绍了如何使用pcl提供的gpu版本法向量计算接口对点云发向量计算进行加速。不足之处在于点云k近邻查找依然比较耗时&#xff0c;成为影响整体计算性能的瓶颈。这篇文章就如何优化点云K近邻查找效率进行实验。上一篇文章的示例代码…

redis数据库的下载安装/免安装版

文章目录下载方式一下载方式二免安装版redis是一款高性能的NOSQL系列的非关系型数据库这里分享三个下载源&#xff0c;只介绍免安装版下载方式一 官网下下载https://redis.io&#xff08;国外网站下载速度比较慢&#xff09; 下载方式二 Redis中文网http://www.redis.net.cn…