printf(str) PK printf("%s", str)

本文深入探讨了C语言中printf(str)与使用%s格式化字符串的区别,并通过实例展示了两者在实际应用中的表现差异,帮助开发者理解并正确使用printf函数。

在书上看见这么一段:

#include <stdio.h>

int main(void)
{
const char *p = "abcd";
const char str1[5] = "abcd";
char str2[5] = "abcd";

printf(p);
printf(str1);
printf(str2);


return 0;
}

突然就搞不懂printf(str)跟printf("%s", str)的区别和联系了。

百度了一下,这种用法其实跟printf("hello,world.\n")是类似的,printf函数的第一个参数是const char*类型的,不管是printf("abcd")还是printf(str),效果都是一样的,就是像printf函数传递了一个const char*的地址,然后printf按照这个地址打印出里面的内容。
可参考man里面的printf:
SYNOPSIS
     #include <stdio.h>
     int
     printf(const char *format, ...);

     int
     fprintf(FILE *stream, const char *format, ...);


只是const char *p = "hello, world"以后再

 

printf(p)跟printf("%s", p)的效果是一样的,但平常为什么不见printf(p)这种看起来很简洁的形式呢,百度了一下,是这个原因:

#include <stdio.h>

int main(void)
{
char *str = "A string with % may not work.\n";

printf("%s", str);
printf(str);

char *str2 = "i want to print %d\n";
printf("%s", str2);
printf(str2);

return 0;
}

gcc编译输出的结果是:

A string with % may not work.
A string with Successay not work.
i want to print %d
i want to print 134513794。

我不晓得为啥%会变成Successay,也不晓得%d会变成134513794这串数字,不过明白了为啥我们总使用printf("%s", str)而不是printf(str)了。

在你提到的这段 `awk` 代码中: ```awk printf "export year=%s\n", substr(date_str, 1, 4) printf "export month=%s\n", substr(date_str, 6, 2) printf "export day=%s\n", substr(date_str, 9, 2) printf "export time=%s\n", time_str ``` ### ✅ 回答你的问题: > `printf` 是必须的吗? **不是必须的,但它是实现当前功能最推荐的方式。** --- ### 🧠 原理解释 你这段脚本的目标是:**从 `ls --full-time` 的输出中提取年、月、日、时间,并赋值给 Shell 变量。** 由于 `awk` 是一个子进程,它不能直接修改父 Shell 的变量,所以使用了 `eval` 和 `export` 的组合来“传递”变量值。 ```bash eval $(echo "$ori_time" | awk '...') ``` 因此,`awk` 需要输出合法的 Shell 变量赋值语句,例如: ```sh export year=2025 export month=11 export day=24 export time=08:26:09 ``` 而 `printf` 是一种格式化输出的命令,它能确保输出符合预期格式,比如: ```bash printf "export year=%s\n" "$year" ``` --- ### ✅ 为什么不能用 `print` 替代 `printf`? 虽然 `print` 也能输出内容,但它的格式控制能力不如 `printf` 强,特别是在拼接字符串、对齐、格式控制等方面。 例如: ```awk print "export year=" substr(date_str,1,4) ``` 虽然可以实现功能,但写起来更麻烦,也不容易控制格式,尤其是字段较多或格式要求严格时。 --- ### ✅ 示例对比 #### ✅ 使用 `printf`(推荐) ```awk printf "export year=%s\n", substr(date_str, 1, 4) ``` 输出: ```sh export year=2025 ``` #### ✅ 使用 `print`(也可行,但不优雅) ```awk print "export year=" substr(date_str, 1, 4) ``` 输出: ```sh export year=2025 ``` 结果一样,但可读性和可维护性差一些。 --- ### ✅ 总结 | 方法 | 是否推荐 | 说明 | |----------|----------|------| | `printf` | ✅ 推荐 | 格式控制强,适合输出 Shell 变量赋值语句 | | `print` | ⚠️ 可行但不推荐 | 容易出错,格式控制弱 | | 其他方式 | ❌ 不适用 | 不推荐用于变量赋值输出 | --- ### ✅ 替代方案(使用 `stat` 获取时间戳更可靠) 如果你系统支持 `stat` 命令,推荐使用: ```bash timestamp=$(stat -c %y "$TARGET_FILE") ``` 然后用 `date` 命令格式化输出时间。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值