退格转义可以取消换行转义吗?

如何解决退格转义可以取消换行转义吗?

我正在使用 ubuntu。 代码:

printf("Hello\n\b world");

我在终端上:

Hello
 world

为什么退格不能取消\n? 字符是否有层次结构?

如何删除特殊字符?

解决方法

您的问题超出了 C 语言的范围:printf("Hello\n\b world"); 输出格式字符串中的字节,可能根据换行符的文本模式处理进行翻译:

  • 在 unix 系统上,字节被输出到未修改的系统句柄。

  • 在 Microsoft 旧系统上,换行符被转换为 CR LF,其他字节未经修改地传输。

如果标准输出被定向到一个文件,在大多数系统上,该文件将包含换行符和退格符 (0x08) 的翻译。

如果标准输出到终端,退格特殊字符的处理取决于系统。大多数系统将光标向左移动一个位置,有些系统会擦除该位置的字符。如果光标已经在第 1 列,则退格键是否将光标移回上一行的末尾,这又取决于系统,无论这意味着什么。大多数系统不会这样做,而是将光标保持在第 1 列。这似乎与您观察到的行为一致。

,

这是 C 标准关于换行符的说法(在 C 2018 5.2.2 2 中):

将活动位置移动到下一行的初始位置。

和退格:

将活动位置移动到当前行上的前一个位置。如果活动位置在一行的初始位置,则显示设备的行为是未指定的。

请注意,没有指定退格字符来擦除前一个字符。指定在显示设备上引起某种动作。

回想一下,C 是在电传打字机和其他物理打印设备普遍使用的时代开发的。许多这些设备只能向上推动纸张。一旦换行符导致纸张被向上推,就无法再次向下移动。

此外,一些早期的视频显示器或驱动它们的软件模拟物理打印并且不支持返回一行,至少在它们的某些操作模式中是这样。

在可以自由移动光标的显示器上,不清楚行首的退格应该做什么。考虑一个显示,它有 80 列,编号从 1 到 80,打印的最后一行包含 40 个字符,后跟一个新行。当我们退格时,我们将光标移回该行,但是我们将它移到哪一列?第80列,显示的最后一个?还是第 40 列,即最后一个打印内容的列?不同的设备可能会以不同的方式处理这个问题。请注意,后一种选择要求设备记住每行的长度,这增加了早期计算机器的负担。 (我高中的廉价显示终端没有足够的内存来记住 24×80 显示器中的所有文本。我认为它只有 1024 个字节,足够 12.8 行 80 个字符。如果你写完整的文本行,它会将较早的行从显示屏上滚动,只保留最后 12 行。)

由于这些行为的变化,C 标准没有指定从行首开始退格的细节。

您询问取消“换行转义”的“退格转义”。但是,转义序列在这里无关紧要;它们与字符的操作处于不同的表示层:

  • 在字符串文字中,HttpResponseNotFound\b 是转义序列。当编译器翻译程序时,它会用退格字符和换行符替换它们。然后它们不再是转义序列;它们只是字符串中的字符。
  • 当您使用 \n 写入字符时,它们将作为流中的字符传输。
  • 当字符被发送到显示设备时(因为这是流所连接的设备),它们会产生上面引用的 5.2.2 2 文本中的操作。
,

那些转义序列 \b\n 代表 control characters。控制字符是一种特殊字符,它以某种特殊方式控制输出设备的行为。当你说

printf("A");

它将(普通)字符 A 打印到屏幕上。但是当你说

printf("\n");

它不打印任何内容,而是将光标向下移动到下一行的开头。

现在,\b 的意思是不是“取消左边的字符”。控制字符 \b 不会“取消”任何内容。它所做的只是将光标向左移动一个字符,如果可以的话。但是如果光标已经在左边缘,它可能不能。

曾几何时,尤其是当输出到实际打印在纸上的打印机时,通常会执行诸如

printf("this is u\b_n\b_d\b_e\b_r\b_l\b_i\b_n\b_e\b_d\b_\n");

printf("this is b\bbo\bol\bld\bd\n");

通过叠印打印带下划线或粗体的单词。这些示例显然依赖于 \b 的向左移动行为。这些示例证明 \b 的行为与“取消”完全不同!

听起来您认为 \b 可能会以某种方式影响它所属的字符串。 听起来您认为 \b 可能会以某种方式由您的 C 编译器或 C 库处理。 听起来您认为字符串 "abc\bdef" 可能会转换为 "abdef"。 但这些都不是真的。退格字符 \b 由您的屏幕或打印机或您的程序“打印”到的任何输出设备解释。 \b 等控制字符的解释主要取决于您的输出设备。它主要不是 C 编程语言的属性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-