代码之家  ›  专栏  ›  技术社区  ›  IIXenon

for循环的printf仅跳过0[已关闭]

  •  1
  • IIXenon  · 技术社区  · 1 年前

    我的一项任务遇到了障碍。

    这是我的转换表中尚未完成的代码。

    int main(int argc, char *argv[]) {
    
        int i = 0; //celsius = 0, fahrenheit = 0;
    
        printf("Celsius\tFahrenheit \n");
    
        for (i = -20 ; i<=300 ; i= (i+20)) //iteration from -20 to 300 °C by +20
        {
            printf("%7.d\t%10d \n",i,i);
        }
    
    
        return 0;
    }
    

    输出看起来是这样的,这与老师所期望的完全一样,减去缺少的0(以及即将实现的转换)

    Celsius Fahrenheit
        -20        -20
                     0
         20         20
         40         40
         60         60
         80         80
        100        100
        120        120
        140        140
        160        160
        180        180
        200        200
        220        220
        240        240
        260        260
        280        280
        300        300
    

    有人能告诉我为什么0一直被跳过,以及如何防止将来发生这种情况吗?

    2 回复  |  直到 1 年前
        1
  •  1
  •   chqrlie    1 年前

    问题在于转换说明符 %7.d :对于整数转换 精确 后面的字段 . 是要生成的最小位数(用前导零填充)。如果未指定 ,默认值为 1 但是 号码是 0 如果后面没有数字 0 精确 是值 0 被转换为空字符串。移除 以解决此问题。

    C标准描述了中的转换说明符 7.23.6.1 fprintf功能 这样:

    每个转换规范都由字符介绍 % % ,按顺序显示以下内容:
    零或更多 旗帜 (以任何顺序)修改转换规范的含义。
    可选最小值 字段宽度 如果转换后的值的字符数少于字段宽度,则在字段宽度的左侧(或右侧,如果已给出稍后描述的左侧调整标志)填充空格(默认情况下)。字段宽度采用星号形式 * (稍后描述)或非负十进制整数。
    可选 精确 b , d , i , o , u , x X conversions,显示在的小数点字符后面的位数 a , A , e , E , f F 转换 g G 转换,或要写入的最大字节数 s 转换。精度采用周期的形式( )后面跟一个星号 * (稍后描述)或通过可选的非负十进制整数;如果只指定了周期,则精度为零。如果精度与任何其他转换说明符一起出现,则该行为是未定义的。
    可选 长度修饰符 指定参数的大小。
    A. 转换说明符 指定要应用的转换类型的字符。

    在里面 %7.d ,没有 旗帜 这个 字段宽度 7 这个 精确 0 (因为 如果只指定周期,则精度为零 ),没有 长度修饰符 以及 转换说明符 d 用于转换 int 作为其十进制表示。

    对于整数转换, 精确 确定最小位数(用多余的数字左填充数字 0 在符号之后(如果有的话),而 字段宽度 指定要输出的最小字符数,符号前用空格填充。

    示例:

    #include <stdio.h>
    
    int main() {
        for (int i = -10; i <= 10; i += 1) {
            printf("|%5d|%5.d|%5.0d|%5.1d|%5.2d|%.5d|%05d|\n", i, i, i, i, i, i, i);
        }
        return 0;
    }
    

    输出:

    |  -10|  -10|  -10|  -10|  -10|-00010|-0010|
    |   -9|   -9|   -9|   -9|  -09|-00009|-0009|
    |   -8|   -8|   -8|   -8|  -08|-00008|-0008|
    |   -7|   -7|   -7|   -7|  -07|-00007|-0007|
    |   -6|   -6|   -6|   -6|  -06|-00006|-0006|
    |   -5|   -5|   -5|   -5|  -05|-00005|-0005|
    |   -4|   -4|   -4|   -4|  -04|-00004|-0004|
    |   -3|   -3|   -3|   -3|  -03|-00003|-0003|
    |   -2|   -2|   -2|   -2|  -02|-00002|-0002|
    |   -1|   -1|   -1|   -1|  -01|-00001|-0001|
    |    0|     |     |    0|   00|00000|00000|
    |    1|    1|    1|    1|   01|00001|00001|
    |    2|    2|    2|    2|   02|00002|00002|
    |    3|    3|    3|    3|   03|00003|00003|
    |    4|    4|    4|    4|   04|00004|00004|
    |    5|    5|    5|    5|   05|00005|00005|
    |    6|    6|    6|    6|   06|00006|00006|
    |    7|    7|    7|    7|   07|00007|00007|
    |    8|    8|    8|    8|   08|00008|00008|
    |    9|    9|    9|    9|   09|00009|00009|
    |   10|   10|   10|   10|   10|00010|00010|
    
        2
  •  0
  •   Vlad from Moscow    1 年前

    来自C标准(7.21.6.1 fprintf函数)

    d、 我 int参数转换为样式为[-]dddd的带符号小数。精度指定要 显得如果正在转换的值可以用更少的 数字,用前导零展开。默认精度为1。 转换精度为零的零值的结果是没有字符。

    下面是一个演示代码片段

    printf( "%7.d\n", 0 );
    printf( "%7.1d\n", 0 );
    

    其输出为

      0
    

    正如你所看到的 printf 不输出任何内容。

    因此明确指定精度。