我在输出浮点数时遇到了一个恼人的问题.当我在Windows上格式化11.545,精度为2小数点时,它输出"11.55",正如我所料.但是,当我在Linux上做同样的事情时,输出是"11.54"!
我最初在Python中遇到了这个问题,但进一步的调查表明,差异在于底层的C运行时库.(该体系结构是x86的64在两种情况下.)运行C的下面的行上产生Windows和Linux的不同的结果,同样因为它在Python.
printf("%.2f", 11.545);
Run Code Online (Sandbox Code Playgroud)
为了更多地了解这一点,我将数字打印到20位小数("%.20f"):
Windows: 11.54500000000000000000
Linux: 11.54499999999999992895
Run Code Online (Sandbox Code Playgroud)
我知道11.545不能精确地存储为二进制数.所以似乎正在发生的事情是Linux以最佳精度输出实际存储的数字,而Windows输出最简单的十进制表示,即.试图猜测用户最有可能的意思.
我的问题是:是否有任何(合理的)方法来模拟Windows上的Linux行为?
(虽然Windows的行为当然是直观的,但在我的情况下,我实际上需要将Windows程序的输出与Linux程序的输出进行比较,而Windows是唯一可以更改的.顺便说一下,我试过查看Windows源代码printf,但执行float-> string转换的实际函数是,_cfltcvt_l并且其源代码似乎不可用.)
编辑:情节变厚!关于这种由不精确表示引起的理论可能是错误的,因为0.125确实具有精确的二进制表示,并且当输出时它仍然不同'%.2f' % 0.125:
Windows: 0.13
Linux: 0.12
Run Code Online (Sandbox Code Playgroud)
但是,round(0.125, 2)在Windows和Linux上都返回0.13.
我打电话的功能funcB从funcA.
funcB使用几个printf语句来输出数据.有没有办法通过我捕获数据funcA?我无法修改funcB.
funcB(){
printf( "%s", "My Name is" );
printf( "%s", "I like ice cream" );
}
funcA(){
funcB();
}
Run Code Online (Sandbox Code Playgroud) 我的问题源于在尝试构建多个位深度平台(例如32/64)时尝试使用printf来记录事物.
一直在养成丑陋头脑的问题是试图在多种体系结构上打印.在32位上它会是这样的
printf(" my int: %d\n", myInt);
Run Code Online (Sandbox Code Playgroud)
但在64位上,它必须改为
print (" my int: %ld\n", (long)myInt);
Run Code Online (Sandbox Code Playgroud)
我有两个相关的问题:
我的第一个想法是,当你告诉printf打印一个变量,给它一个格式时,它会查看该变量的地址并获取该格式所需的字节数.这一开始似乎是个大问题.例如,如果你有一个变量myChar,它是一个char(1个字节),但使用了%d的格式说明符,那将告诉printf转到myChar的地址并获取接下来的4个字节,将其视为int.如果是这种情况,似乎printf会从相邻变量中获取垃圾日期(因为它抓取了4个字节,但实际值只有1个字节).然而,情况似乎并非如此.通过使用myChar并指定%d,printf抓取1个字节,然后用0表示填充高3个字节.我的理解在这里是否正确?
如果上述情况属实,那么始终将变量提升到最大值是否有任何真正的危害,以避免在32/64位情况下出现的问题类型.例如,如果你有一个短变量myShort和一个int变量myInt,那么打印它们总是有任何缺点:
printf("myShort%ld",(long)myShort); printf("myInt%ld",(long)myInt);
谢谢你的任何澄清.
刚才知道java确实有一个方法命名printf,那么printf&之间的区别是println什么?
我有一些旧的C代码,我试图复制C++中的行为.它使用printf修饰符:"%06.02f".
我天真地认为这iomanip同样有能力,并做了:
cout << setfill('0') << setw(6) << setprecision(2)
Run Code Online (Sandbox Code Playgroud)
当我尝试输出测试号123.456时,printf产量:
123.46
但cout收益率:
1.2 + E02
有什么我可以做的iomanip来复制这个,还是我必须回去使用printf?
[ 实例 ]
我正在尝试使用宽度说明符和printf函数格式化c中某些字符串的输出.但是我无法获得我想要的行为.似乎每次printf遇到字符å,ä或ö时,为字符串保留的宽度会缩小一个位置.
代码片段说明:
#include <stdio.h>
int main(void)
{
printf(">%-10s<\n", "aoa");
printf(">%-10s<\n", "aäoa");
printf(">%-10s<\n", "aäoöa");
printf(">%-10s<\n", "aäoöaå");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的ubuntu linux bash-shell中输出.
>aoa <
>aäoa <
>aäoöa <
>aäoöaå <
Run Code Online (Sandbox Code Playgroud)
我正在寻找有关如何处理这个问题的建议.我想要的是上面代码片段中的所有字符串都在空格填充的10字符宽字段中打印,如下所示:
>aoa <
>aäoa <
>aäoöa <
>aäoöaå <
Run Code Online (Sandbox Code Playgroud)
如果这不是其他设置的问题,我也很感激有关为什么会发生这种情况或反馈的任何见解.
我试图学习指针,我写了下面的代码来打印指针的值:
#include <stdio.h>
int main(void) {
char *p = "abc";
printf("%c",*p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
一个
但是,如果我将上面的代码更改为:
#include <stdio.h>
int main(void) {
char *p = "abc";
printf(p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到输出:
ABC
我不明白以下两件事:
为什么printf在第二种情况下不需要格式说明符?是否printf(pointer_name)足以打印指针的值?
根据我的理解(这很少),*p指向包含的连续内存块abc.我预计两个输出都是相同的,即
ABC
由于印刷方式不同,是不同的产出?
编辑1
此外,以下代码会产生运行时错误.为什么这样?
#include <stdio.h>
int main(void) {
char *p = "abc";
printf(*p);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我刚碰巧看了printf(和其他fprintf类函数)的原型-
int printf(const char * restrict format, ...);
Run Code Online (Sandbox Code Playgroud)
restrict如果我理解正确的关键字,如果标记了其中一个,则禁止通过两个指针访问同一个对象restrict.
这里引用了与C标准相同的例子.
restrict我认为标记格式的一个好处是保存函数,使其不会在执行期间修改格式字符串(比如因为%n格式说明符).
但这是否会产生更大的约束?这会使以下函数调用无效吗?
char format[] = "%s";
printf(format, format);
Run Code Online (Sandbox Code Playgroud)
因为这里有明显的别名.为什么将restrict关键字添加到format参数中printf?
我想知道如果我们打印内容中包含“%s”的字符串会是什么结果?
我尝试将其打印为“ hi%s”。
char *ptr="hi%s";
printf(ptr);
Run Code Online (Sandbox Code Playgroud)
我希望输出为“ hi”。但我以“嗨,嗨,%s”的名字得到它。
“嗨,嗨,%s”
我不明白为什么nt在此程序中输出。
谁能解释这个程序?
#include <stdio.h>
#include <stdlib.h>
int main(){
printf(3+"excellent"+4); //output is "nt"
return 0;
}
Run Code Online (Sandbox Code Playgroud)