我想将printf格式的输出存储在变量中,但由于某种原因它会删除格式.
这是正确的输出
$ printf "%-40s %8s %9s %7s" "File system" "Free" "Refquota" "Free %"
File system Free Refquota Free
Run Code Online (Sandbox Code Playgroud)
现在格式化了
$ A=$(printf "%-40s %8s %9s %7s" "File system" "Free" "Refquota" "Free %")
$ echo $A
File system Free Refquota Free %
Run Code Online (Sandbox Code Playgroud) 问题是在一个平台上(windows,mvsc2015)uint64_t被定义为unsigned long long另一个平台(ubuntu,clang),unsigned long并且有代码看起来像
sprintf(buffer, "%#llx", u64key);
我对这种行为感到困惑printf("%f", M_PI).它打印出来3.141593,但是M_PI是3.14159265358979323846264338327950288.为什么printf会这样做,如何让它打印出整个浮动.我知道%1.2f格式说明符,但如果我使用它们然后我得到一堆未使用的0并且输出很难看.我想要浮子的整个精度,但不是额外的任何东西.
log4cplus是否提供了以C-Style/printf格式打印的API?
原因:我想在C代码中使用log4cplus(除了C++之外)并且不想事先准备好字符串.
我试图将我的数独求解程序的结果打印到终端中,如下所示:
+-------+-------+-------+
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
+-------+-------+-------+
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 …Run Code Online (Sandbox Code Playgroud) 我想说数组ar1和ar2我希望这两个数组都打印在两列中.
printf "%s\t%s\n" "${ar1[@]}" "${ar2[@]}"
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
在朱莉娅,当我想要打印宽度为10的数字"4"时,我会:
@printf("%10d", 4)
Run Code Online (Sandbox Code Playgroud)
如果我想将宽度设置为特定字符串的长度,例如:
mystr = "Hello World"
Run Code Online (Sandbox Code Playgroud)
如何将"%10d"中的10改为length(mystr)?
我对C++世界比较陌生.我知道std::cout用于C++中的控制台输出.但请考虑C中的以下代码:
#include<stdio.h>
int main(){
double dNum=99.6678;
printf("%.02lf",dNum);
//output: 99.67
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如何cout在C++中使用最多2位小数的双重类型值实现类似的格式化?
我知道C++与C向后兼容.但是如果有的话,C++中是否有printf()等价,那么它定义在哪里?
在C(n1570 7.21.6.1/10)和C++(通过包含C标准库)中,未定义的行为是为printf提供其类型与其转换规范不匹配的参数.一个简单的例子:
printf("%d", 1.9)
Run Code Online (Sandbox Code Playgroud)
格式字符串指定int,而参数是浮点类型.
这个问题的灵感来自于一个用户遇到遗留代码的问题,这些代码存在大量的转换不匹配,这显然没有任何损害,参见 理论和实践中未定义的行为.
声称格式不匹配UB起初看起来很激烈.很明显,输出可能是错误的,具体取决于精确的不匹配,参数类型,字节序,可能的堆栈布局和其他问题.正如一位评论员指出的那样,这也延伸到后来的(甚至是之前的?)论点.但这远不是一般的UB.就个人而言,除了预期的错误输出外,我从未遇到任何其他问题
冒险猜测,我会排除对齐问题.我可以想象的是,提供一个格式字符串,使得printf期望大数据和小的实际参数可能让printf读取超出堆栈,但我缺乏对var args机制和特定printf实现细节的深入了解来验证.
我快速浏览了printf源代码,但它们对于休闲读者来说非常不透明.
因此我的问题是:错误匹配转换说明符和printf使其成为UB的参数有哪些具体危险?
#include <stdio.h>
int main(void) {
int a[5] = {0, 1, 2, 3, 4}, *p;
p = a;
printf("%d\n%d\n%d\n%d\n%d\n", p, *p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我执行此代码时,我得到p的负值.我研究过地址不能否定.那为什么我有一个负值