【问题标题】:What is the difference between %d and %*d in c language?c语言中的%d和%*d有什么区别?
【发布时间】:2012-03-30 04:31:42
【问题描述】:

%*d 是什么?我知道%d 用于integers,所以我认为%*d 也必须只与整数有关?它的目的是什么?它有什么作用?

int a=10,b=20;
printf("\n%d%d",a,b);
printf("\n%*d%*d",a,b);

结果是

10 20 
1775 1775 

【问题讨论】:

  • 看起来像一个宽度说明符:cplusplus.com/reference/clibrary/cstdio/printf
  • @Mysticial 你应该把它写成答案..
  • @Ben,这只是一个链接 - 不能作为答案。我懒得展开了……
  • @Ben,显然它确实值得反对。只需阅读文档即可立即获得答案。
  • 对于downvotes,它可以通过“这个问题没有显示任何研究努力......”来证明是合理的,但我倾向于让新手稍微松懈,不像guga ,我今天早上感觉太冷漠了,无法发表反对票:-)。顺便说一句,最后一个printf 是未定义的行为,因为您应该传递 四个 参数。

标签: c integer


【解决方案1】:

printf 中的%*d 允许您使用变量 来控制字段宽度,如下所示:

int wid = 4;
printf ("%*d\n", wid, 42);

这会给你:

..42

(每个. 字符都是一个空格)。 * 使用一个参数widd 使用42

你的表格,比如:

printf ("%*d %*d\n", a, b);

根据标准是未定义的行为,因为您应该在格式字符串之后提供 四个 参数,而不是两个(如果您提高警告级别)。来自C11 7.20.6 Formatted input/output functions

如果格式的参数不足,则行为未定义。

应该是这样的:

printf ("%*d %*d\n", 4, a, 4, b);

您得到奇怪输出的原因是由于未定义的行为。 This excellent answer 向您展示了当您不遵守规则时可能出错的事情(以及原因),尤其是在这种情况下。

现在我不认为这是一个错位问题,因为您对所有数据类型都使用了int,但是与所有未定义的行为一样,任何事情都可能发生。

【讨论】:

    【解决方案2】:

    与 scanf() 函数一起使用时,表示解析一个整数,但结果不存储在任何地方。

    与 printf() 函数一起使用时,表示宽度参数由下一个格式参数指定。

    【讨论】:

      【解决方案3】:

      * 表示宽度作为 printf 的参数传递

      【讨论】:

      • 那为什么会产生输出 1775 1775 呢?
      • printf是可变参数函数,所以在解析格式字符串的时候,会寻找一个整数,代表第一个值的宽度、值本身、第二个值的宽度和第二个值.因为您只传递 2 个值,所以使用的值是未定义的。尝试使用 4 个有意义的值并查看结果。
      【解决方案4】:

      在“%*d”中,第一个参数定义为输出的总宽度,第二个参数作为普通整数。 对于以下程序

      int x=6,p=10;
      printf("%*d",x,p);
      output: "    10"
      

      为 * 传递的第一个参数 ta,它定义了输出的总宽度……在这种情况下,宽度被传递为 6。所以整个输出的长度将为 5。 现在到数字 10,需要两个位置(1 和 0,总共 2)。所以剩余的 5-2=3 个空字符串或 '\0' 或 NULL 字符将在实际输出之前连接起来

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-30
        • 1970-01-01
        • 2015-08-17
        相关资源
        最近更新 更多