对浮动和字符串的输出感到困惑

时间:2014-02-03 12:26:44

标签: c

#include<stdio.h>

int main(void)
{

float var = 15.4339;
char nam[9] = "chandler";

printf("%8.1lf\n",var);
printf("%-8.2f\n",var);
printf("%4s",nam);
printf("%4.1f\n",var+1.05);

return 0;
}

产生的输出是:

     15.4
15.43
chandler16.5

我很担心这个输出。 当使用%a.bf通过printf输出浮点数时,该怎么办?它有什么影响吗?是否强制将带有+ 1位数的数字作为一个只有一位数的数字输出?通过舍入它?

为什么第一个输出偏移?它输出8个字符,其中2个是带有6个空格的“15”吗?

为什么%4s输出整个char数组而不仅仅是4个字符?

1 个答案:

答案 0 :(得分:1)

在C中输出浮点数时,“%a.bf”指的是在小数点(a)之前要打印的最小字符数和将要使用的精度(b) 。 “a”将显示完整的数字,或者如果它比指定的大小短,则用前导空格填充它(在这种情况下,这就是你的输出以它的方式间隔开的原因)。如果您的数字为+ 1位且尝试打印时使用的是%a.xf,则会显示所有a + 1位数,因为该数字未被截断,仅填充以达到该大小。

在讨论填充宽度时,在数字前使用连字符(例如%-10.4f)将用空格填充数字的末尾。如果您要在该行的末尾添加文本,您会发现文本后面有许多空格。

%4s显示整个字符串,因为它只是最小值,因此当长度超过您指定的长度时不会截断。

作为要运行的示例代码,请尝试以下操作:

#include <stdio.h>

int main() {
    double testDouble = 9876.1234567;
    char testString[] = "Test string";

    printf("1: %f\n" ,testDouble);
    printf("2: %2f\n" ,testDouble);
    printf("3: %20f\n" ,testDouble);
    printf("4: %-20f Example Text\n" ,testDouble);
    printf("5: %.0f\n" ,testDouble);
    printf("6: %.3f\n" ,testDouble);
    printf("7: %.4f\n" ,testDouble);
    printf("8: %.30f\n" ,testDouble);
    printf("9: %s\n" ,testString);
    printf("10: %4s\n" ,testString);
    printf("11: %40s\n" ,testString);
    printf("12: %-40s Example Text\n" ,testString);
    return(0);
}

这输出以下内容:

1: 9876.123457
2: 9876.123457
3:          9876.123457
4: 9876.123457          Example Text
5: 9876
6: 9876.123
7: 9876.1235
8: 9876.123456699999200000000000000000
9: Test string
10: Test string
11:                              Test string
12: Test string                              Example Text

你可以看到在1,2,3和4中,数字从不被截断,但如果需要,它会被填充到更大的数量。

在5,6,7和8中,您可以看到如何格式化精度(结果在7中舍入,在8中显示太多字符以准确无误。)

在9,10,11和12中,您会看到应用于字符串的格式选项。