微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Linux中的printf问题

以下是在HP和Linux上打印格式化为“1.2”的简单程序。 但是,行为是不同的。 我不想让这个问题变大,但是这个实际发生的程序在string中有一个浮点值,所以使用%f不是一个选项(即使使用sprintf)。

有没有人遇到过这个? 哪种行为是正确的?

这不应该是一个编译器的问题,但仍然尝试过在gcc,icpc,icc,g ++。

#include <stdio.h> int main() { printf("%s = [%010s]n","[%010s]","1.2"); return 0; } **HP:** cc test2.c -ot ; ./t [%010s] = [00000001.2] **Linux:** icc test2.c -ot ; ./t [%010s] = [ 1.2]

编辑:非常感谢你的回应:)

我怎样才能下载前一天有个名字的文件

sudo -E不通过PYTHONPATH

Linux内核调度

将文本从nano编辑器复制到shell

使用单个bash shell命令获得gb中的可用内存

与Clang编译时,链接程序无法在64位Mint OS下find32位库

需要拦截HID键盘事件(然后阻止它们)

如何在linux中获取特定进程的cpu利用率

使用Scipy最小化数据线性组合的function

硬中断和softirq

从glibc printf(3)手册页:

0 The value should be zero padded. For d,i,o,u,x,X,a,A,e,E,f,F,g,and G conversions,the converted value is padded on the left with zeros rather than blanks. If the 0 and - flags both appear,the 0 flag is ignored. If a precision is given with a numeric conversion (d,and X),the 0 flag is ignored. For other conversions,the behavior is undefined.

所以不能期望有s的0标志在基于glibc的系统上用0来填充字符串。

根据man页,除了d,i,o,u,x,X,a,A,e,E,f,F,g和G转换之外, 0标志的行为是不确定的。 所以两者都很好。

编辑:当我说“好”,我的意思是从编译器/ libc的角度来看。 从您的应用程序的角度来看,您所依赖的行为(在Linux和HP上)是一个错误,您应该正确地进行格式化打印。

如果您不想要前导零填充,请忽略前导零填充指示符:

printf("%s = [%10s]n","1.2");

一个令人惊讶的实现是用零来填充字符串,但很容易纠正。

除了Ignacio Vazquez-Abrams所说的,根据printf的文档,你所做的事情的结果是未定义的行为。 两个操作系统产生不同的结果这一事实并不意外。

实际上,在Ubuntu上编译gcc 4.5.2的代码给出了以下警告:

警告:与'%s'gnu_printf格式一起使用'0'标志

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐