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

#程序员如何平衡日常编码工作与提升式学习?#

【学习笔记】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

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值