【学习笔记】printf中%m的含义

news2024/9/20 22:39:57

【学习笔记】printf中%m的含义

在有些代码中会看到如下的写法:

printf("%m\n");

printf中使用了%m来打印输出,那么%m又是什么意思呢?

程序员

其实%m 并不是在所有的 printf 实现中都通用或标准化的选项,而是在某些特定的编程语言或库中有特定的含义,其中最常见的就是在GNU C Library (glibc)中是一个特殊格式化选项,用于输出当前错误码(errno)对应的错误描述信息。

这种格式化选项的主要作用是简化错误处理和错误信息的输出,特别是在涉及系统调用或库函数返回错误时非常有用。

具体来说,当你在使用 printf 或类似的函数输出错误信息时,可以使用 %m 来自动输出当前 errno 对应的错误描述字符串。例如:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *file = fopen("nonexistentfile.txt", "r");
    if (file == NULL) {
        printf("Error message: %m\n");
        printf("Error message: %s\n", strerror(errno));
        return 1;
    }
    fclose(file);
    return 0;
}

编译运行后的输出结果:

Error message: No such file or directory
Error message: No such file or directory

在这个例子中,如果 fopen 打开文件失败(因为文件不存在),%m 将会被替换为对应的错误描述信息,例如 “No such file or directory”。这种方式比手动调用 strerror(errno) 更为简洁和方便。

在使用类似的函数如fprintf来输出错误信息,也可以使用 %m 来自动输出当前 errno 对应的错误描述字符串。

int main(int argc, char* argv[])
{
    FILE *file = fopen("nonexistentfile.txt", "r");
    if (file == NULL) {
        fprintf(stderr, "Error message: %m\n");
        fprintf(stderr, "Error message: %s\n", strerror(errno));
        return 1;
    }
    fclose(file);
    return 0;
}

需要注意的是,%m 的功能依赖于系统的错误码及其描述信息的定义,因此在不同的操作系统或环境下可能有所差异。在 Linux 系统下,通常可以正常使用 %m 来获取标准的错误描述信息。

总结起来,%m 是 GNU C Library 中 printf 等函数的一个扩展,用于输出当前错误码对应的错误描述信息,是 C 语言中处理错误信息时的一种方便和标准化的方式。

程序员2

你可以使用 man 命令来查看 printf 函数及其格式化选项的详细说明。在终端中输入以下命令:

man 3 printf

这将打开关于 printf 函数及其相关格式化选项的手册页面。在手册页面中,你可以找到对 %m 格式化选项的详细描述,包括它的用法、语法和示例。手册页面通常会提供广泛的信息,帮助你理解如何正确使用这些函数和格式化选项。

运行man 3 printf后找到m的解释如下:

   m      (Glibc extension; supported by uClibc and musl.)  Print output of strerror(errno).  No argument
          is required.
  1. (Glibc extension; supported by uClibc and musl.)

    可以看到%m是 GNU C Library (glibc) 的一个扩展,也支持在一些其他的 C 库中,如 uClibc 和 musl。

  2. Print output of strerror(errno).

    %m 的作用是打印当前 errno 对应的错误信息,具体内容由 strerror(errno) 函数提供。这意味着 %m 会自动输出最近的系统调用或库函数失败时的错误描述信息,而无需显式调用 strerror(errno) 函数。

  3. No argument is required.

    使用 %m 时不需要提供额外的参数,它会自动获取当前的 errno 并输出相应的错误信息。

简而言之,%mprintf 函数的一个扩展格式化选项,用于便捷地输出当前错误码 errno 对应的错误描述信息,这在处理错误时非常方便和实用。


本文链接:https://blog.csdn.net/u012028275/article/details/141292061

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

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

相关文章

vue的markdown编辑器插件比对

vue的markdown编辑器插件比对 文章说明md-editor-v3的使用及效果展示vditor的使用及效果展示 文章说明 文章比对 md-editor-v3、vditor 这两个插件的使用及效果体验 md-editor-v3的使用及效果展示 安装 npm install md-editor-v3使用 <script setup> import {reactive} f…

图神经网络(Graph Neural Networks)是什么?

图神经网络&#xff08;Graph Neural Networks&#xff09;是什么&#xff1f; 引言 在数据科学和机器学习的广阔领域中&#xff0c;图结构数据以其独特的复杂性和丰富性成为了一个重要的研究方向。从社交网络中的用户关系&#xff0c;到生物信息学中的蛋白质交互网络&#x…

跨进程通信使用 Zenoh中间件 进行高效数据传输的测试和分析

文章目录 1. 引言2. Zenoh C 使用指南2.1 安装 Zenoh C 库2.2 编写基本的 Zenoh C 程序订阅示例发布示例 2.3 编译和运行程序 3. Zenoh 与 ROS2 集成3.1 安装 Zenoh3.2 安装 ROS2 的 Zenoh RMW 实现3.3 设置 RMW 实现为 Zenoh3.4 验证配置 4. 编写基于 Zenoh 的 ROS2 应用程序4…

Linux系统编程 --- 多线程

线程&#xff1a;是进程内的一个执行分支&#xff0c;线程的执行粒度&#xff0c;要比进程要细。 一、线程的概念 1、Linux中线程该如何理解 地址空间就是进程的资源窗口。 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1…

浏览器遇到的问题

下载的时候遇到&#xff0c;需要授权&#xff0c;无法下下载 将隐私里面的全部关掉

虚幻5|AI巡逻宠物伴随及定点巡逻—初步篇

一.建立AI基本三件套 1.建立AI基本三件套 二.使用AI的基本设置 1.打开我们想要用的AI宠物的蓝图&#xff0c;选中自我Actor,右侧细节处找到AI&#xff0c;选中对应的AI控制器 三.打开AI控制器 写如下 四&#xff0c;AI行为树 1.新建一个任务&#xff0c;命名含巡逻二字即可…

BigInteger与BigDecimal

BigInteger BigInteger构造方法 public BigInteger(int num, Random rnd) 获取随机大整数&#xff0c;范围&#xff1a;[0 ~ 2的num次方-1] public BigInteger(String val) 获取指定的大整数 public BigInteger(String val, int radix) 获取指定进制的大整数 构造方法小结…

Power Query抓取多页数据导入到Excel

原文链接 举例网站&#xff1a;http://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/ggtj/index.phtml?last5&p1 操作步骤 &#xff08;版本为&#xff1a;Excel2010&#xff09;&#xff1a; Step-01&#xff1a;单击【Power Query】-【从Web】&#xff0c;…

Java之文件操作和IO

目录 File类 属性 构造方法 方法 文件内容的读写 InputStream OutputStream File类 属性 修饰符及类型属性说明static StringpathSeparator依赖于系统的路径分隔符&#xff0c;String类型的表示static charpathSeparator依赖于系统的路径分隔符&#xff0c;char类型的…

ps磨皮滤镜插件Imagenomic Portraiture 4.5 Build 4501中文版

PS磨皮神器更新为Portraiture 中文汉化版&#xff08;支持PS 2024&#xff09; 。Portraiture 4.5 Build 4501中文绿色破解版是一款非常强大的适用于Photoshop&#xff0c;Lightroom&#xff0c;Aperture的人物磨皮&#xff08;人物润色&#xff09;插件。Portraiture插件被经常…

基于eBPF的procstat软件追踪C++ STL容器扩容

在性能敏感的C程序中&#xff0c;标准模板库&#xff08;STL&#xff09;容器的扩容操作往往是导致性能抖动的原因之一。扩容操作可能会引发内存重新分配和数据迁移&#xff0c;从而导致性能不稳定。然而&#xff0c;由于C标准库的扩容函数通常被内联化&#xff0c;传统的方法难…

Geekbench AI 1.0正式发布:AI性能评估

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

STM32标准库学习笔记-4.定时器中断

参考教程&#xff1a;【STM32入门教程-2023版 细致讲解 中文字幕】 定时器简介 TIM&#xff08;Timer&#xff09;定时器。定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断。16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计…

vue3响应式工具 toRefs() 和 toRef()

前言 直接解构响应式对象的属性进行赋值给新的变量&#xff0c;会导致新变量失去响应式。 当修改新变量的值时&#xff0c;不会触发原始响应式对象的更新&#xff0c;从而在模板中也不会有相应的视图更新。 示例&#xff1a; <template><div><p>姓名: {{ …

垂直行业数字化表现抢眼 亚信科技全年利润展望乐观

大数据产业创新服务媒体 ——聚焦数据 改变商业 2024年8月14日&#xff0c;亚信科技控股有限公司&#xff08;股票代码&#xff1a;01675.HK&#xff09;公布了公司截至2024年6月30日的中期业绩。 财报数据显示&#xff0c;2024年上半年&#xff0c;亚信科技的营业收入为人民币…

Java巅峰之路---进阶篇---面向对象(一)

static关键字 介绍 static表示静态&#xff0c;是java中的一个修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量。 其中&#xff0c;被static修饰的成员变量&#xff0c;叫做静态变量&#xff1b;被static修饰的成员方法&#xff0c;叫做静态方法。 静态变量 调用…

水凝胶和皮肤再生有关系?那它是什么玩意儿?

大家好&#xff0c;今天我们来聊聊皮肤再生与水凝胶的关系。这篇《Hydrogel-Based Skin Regeneration》是发表于《International Journal of Molecular Sciences》上的一篇文章。皮肤作为人体最大的器官&#xff0c;其伤口愈合至关重要&#xff0c;但传统治疗方法有局限性。组织…

数据结构(Java):揭开二叉搜索树删除机制的奥秘

目录 1、二叉搜索树 1.1 概念 2、代码模拟实现 2.1 插入操作 2.2 查找操作 2.3 &#x1f31f;删除操作&#x1f31f;&#xff08;难点&#xff09; 2.3.1 要删除节点的左子树为空 2.3.2 要删除节点的右子树为空 2.3.3 要删除节点的左右子树均不为空 2.3.4 删除操作代码…

认知杂谈17

今天分享 有人说的一段争议性的话 I I 男人撑起一片天&#xff0c;背后是默默的坚守与承担 说起生孩子这事儿啊&#xff0c;对大多数男同胞来讲&#xff0c;那真是又温馨又充满挑战。要当爸爸了&#xff0c;这意味着责任重大&#xff0c;心里期待满满&#xff0c;一方面得…

函数图像绘制小工具

函数图像绘制小工具 文章说明核心代码效果展示源码下载 文章说明 方便绘制一些数学的基础图象&#xff0c;制作该款小工具&#xff0c;不过尚为雏形阶段&#xff0c;等待后续逐步完善 核心代码 采用canvas绘图实现&#xff0c;核心代码如下 <script setup> import {onMou…