printf %m 分析

printf %m


在了解printf源码的时侯, 突然发现的一个问题.

我在linux环境下写下面的代码时的结果让我很惊讶.

#include <stdio.h>

int main()
{
    printf("%m\n");

    return 0;
}

运行结果

rpz@funct:~$ ./a.out 
Success

恩? 发现怎么回事儿 … 在我检查了揉了几次眼睛之后, 确定我这代码没有任何问题, 但是结果依然是这个, 尝试几次之后, 接受了这个结果.

当我将%m改为%M的尝试.

rpz@funct:~$ ./a.out 
%M

看来结果只是对%m有用, 对%M没有用. 去查询了一些资料才发现

%m Print output of strerror(errno). No argument is required.

现在算是明了了很多, 原来linux上 %m 是显示 errno 的值对应的提示, 基本等价于strerror(errno)如果不清楚strerror函数的可以点击了解下.

现在就来验证一下吧.

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

int main()
{
    printf("%m\n");
    printf("strerrno = %s\n", strerror(errno));

    errno = 1;
    printf("%m\n");
    printf("strerrno = %s\n", strerror(errno));

    return 0;
}

运行结果

rpz@funct:~$ ./a.out 
Success
strerrno = Success
Operation not permitted
strerrno = Operation not permitted

跟预期的一样了, 现在关于 printf %m 这个问题也就解决了. 我也在windows下验证了, 没有这个效果, 所以还是linux才有.

<think>好的,用户遇到了find命令中使用-printf参数不可用的问题。首先,我需要确认这个问题的可能原因。-printf是GNU find的扩展参数,可能在非GNU系统(如BSD或macOS)上不可用。用户可能在非Linux系统上使用,比如macOS,导致该参数不被支持。 接下来,我应该检查用户的系统类型。可以通过建议用户运行`find --version`来查看是否为GNU find。如果是BSD系统,可能需要安装GNU findutils,比如通过Homebrew安装`findutils`,然后使用gfind命令。 另外,用户可能误用了-printf的格式。需要提醒用户检查格式是否正确,例如使用`%p`表示文件名,`%f`表示无路径的文件名,以及正确的转义字符,比如换行符`\n`。 如果用户无法安装GNU find,可能需要提供替代方案,比如结合使用find和stat命令,或者使用xargs和printf来处理输出。同时,确保用户有足够的权限执行命令,避免权限问题导致参数无效。 还需要参考用户提供的引用内容,但看起来之前的引用主要关于编译错误、gcc帮助和编码设置,可能与当前问题关联不大。不过,引用[1]提到文件路径的问题,可能在权限或路径错误时有类似情况,但这里可能不直接相关。因此,主要围绕find命令的版本和参数使用进行解答。 最后,生成相关问题,帮助用户进一步解决可能遇到的类似问题,比如检查系统类型、替代参数的使用以及安装GNU工具的方法等。</think>在Linux/Unix系统中`find`命令的`-printf`参数不可用,通常由以下原因导致: --- ### 一、原因分析 1. **GNU find与BSD find的差异** `-printf`是GNU find的扩展功能,非GNU系统(如BSD/macOS)默认不支持。可通过以下命令验证: ```bash find --version | grep GNU ``` 若输出不包含"GNU",则系统使用BSD find。 2. **路径优先级问题** 系统中可能同时存在多个`find`版本,需检查GNU find的安装路径是否在`$PATH`中优先级更高: ```bash which find ``` --- ### 二、解决方案 #### 方法1:安装GNU findutils(适用于BSD/macOS) 1. macOS通过Homebrew安装: ```bash brew install findutils ``` 2. 使用`gfind`调用GNU版本: ```bash gfind /path -type f -printf "%p\n" ``` #### 方法2:改用通用参数替代`-printf` - **使用`-ls`输出详细列表**: ```bash find /path -name "*.txt" -ls ``` - **结合`stat`命令**: ```bash find /path -type f -exec stat -c "%n %y" {} \; ``` - **通过`xargs`管道传递**: ```bash find /path -type f | xargs -I{} echo "File: {}" ``` #### 方法3:检查语法格式 确保`-printf`格式正确,例如: ```bash # 正确示例:文件名+修改时间 find . -type f -printf "File: %p, Modified: %t\n" ``` --- ### 三、验证操作 ```bash # 确认GNU find可用性 gfind --version # 测试-printf参数 gfind /tmp -maxdepth 1 -type f -printf "%f\t%s bytes\n" ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值