标签: printf

在Windows上模拟Linux的浮点字符串转换行为

我在输出浮点数时遇到了一个恼人的问题.当我在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.

c python floating-point precision printf

7
推荐指数
1
解决办法
1277
查看次数

如何捕获printf的输出?

我打电话的功能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)

c++ printf

7
推荐指数
1
解决办法
8988
查看次数

在printf参数中提升类型是危险的吗?

我的问题源于在尝试构建多个位深度平台(例如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)

我有两个相关的问题:

  1. 我的第一个想法是,当你告诉printf打印一个变量,给它一个格式时,它会查看该变量的地址并获取该格式所需的字节数.这一开始似乎是个大问题.例如,如果你有一个变量myChar,它是一个char(1个字节),但使用了%d的格式说明符,那将告诉printf转到myChar的地址并获取接下来的4个字节,将其视为int.如果是这种情况,似乎printf会从相邻变量中获取垃圾日期(因为它抓取了4个字节,但实际值只有1个字节).然而,情况似乎并非如此.通过使用myChar并指定%d,printf抓取1个字节,然后用0表示填充高3个字节.我的理解在这里是否正确?

  2. 如果上述情况属实,那么始终将变量提升到最大值是否有任何真正的危害,以避免在32/64位情况下出现的问题类型.例如,如果你有一个短变量myShort和一个int变量myInt,那么打印它们总是有任何缺点:

    printf("myShort%ld",(long)myShort); printf("myInt%ld",(long)myInt);

谢谢你的任何澄清.

c logging printf

7
推荐指数
1
解决办法
1097
查看次数

java中printf和println的区别?

刚才知道java确实有一个方法命名printf,那么printf&之间的区别是println什么?

java printf println

7
推荐指数
1
解决办法
2万
查看次数

使用iomanip匹配printf格式

我有一些旧的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?

[ 实例 ]

c++ floating-point printf cout modifiers

7
推荐指数
1
解决办法
529
查看次数

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)

如果这不是其他设置的问题,我也很感激有关为什么会发生这种情况或反馈的任何见解.

c printf

7
推荐指数
2
解决办法
749
查看次数

字符指针和printf函数

我试图学习指针,我写了下面的代码来打印指针的值:

#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

我不明白以下两件事:

  1. 为什么printf在第二种情况下不需要格式说明符?是否printf(pointer_name)足以打印指针的值?

  2. 根据我的理解(这很少),*p指向包含的连续内存块abc.我预计两个输出都是相同的,即

ABC

由于印刷方式不同,是不同的产出?

编辑1

此外,以下代码会产生运行时错误.为什么这样?

 #include <stdio.h>

    int main(void) {
        char *p = "abc";
        printf(*p);
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

c printf pointers

7
推荐指数
2
解决办法
4万
查看次数

为什么printf中的格式标记为restrict?

我刚碰巧看了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?

c printf restrict

7
推荐指数
1
解决办法
608
查看次数

如果我们打印一个包含“%s”的字符串,输出将是什么?

我想知道如果我们打印内容中包含“%s”的字符串会是什么结果?

我尝试将其打印为“ hi%s”。

char *ptr="hi%s";
printf(ptr);
Run Code Online (Sandbox Code Playgroud)

我希望输出为“ hi”。但我以“嗨,嗨,%s”的名字得到它。

“嗨,嗨,%s”

c printf c-strings undefined

7
推荐指数
3
解决办法
293
查看次数

这行的printf(3+“ excellent” +4)如何运行?

我不明白为什么nt在此程序中输出。
谁能解释这个程序?

#include <stdio.h>
#include <stdlib.h>

int main(){

    printf(3+"excellent"+4); //output is  "nt"

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c string printf

7
推荐指数
3
解决办法
175
查看次数