【问题标题】:printf / sprintf issue with remove sign on numbersprintf / sprintf 问题与删除数字签名
【发布时间】:2015-05-16 18:16:46
【问题描述】:

我有一个可能是负数或正数的数字,我希望它在没有负号或正号的情况下从 sprintf() 中弹出。我该怎么做?

我试过%d% d%- d%+ d% -d% +d,但它们都不起作用。

我尝试了 gcc 4.8.2 和 g++ 4.8.2,但它不起作用。这是 gcc 的错误吗?

【问题讨论】:

  • 你能提供一些意见吗?
  • 如果您可以在任何规范中读到有一种方法可以使用格式字符串删除减号,那将是一个错误。
  • cplusplus.com/reference/cstdio/printf 转到标志中的(空格)
  • 将值传递给sprintf时使用abs()
  • 照乔纳森写的去做。喜欢:int x = -5; printf("%d", abs(x));

标签: c++ c gcc g++ printf


【解决方案1】:

没有应用绝对值功能的格式字符串。

这是你必须做的:

#include <stdio.h>
#include <math.h>

void main()
{
  int num = -6000;
  printf("%d\n", abs(num));
}
  • %d 会将 34 渲染为 34,将 -34 渲染为 -34
  • % d 会将 34 渲染为(空格)+ 34,将 -34 渲染为 -34
  • %+d 会将 34 渲染为 +34,将 -34 渲染为 -34
  • "%5d 将 34 呈现为(三个空格)+ 34 和 -34 呈现为(两个空格)+ -34。他们都将使用字段大小 5。
  • "%-5d 会将 34 呈现为 34 +(三个空格),将 -34 呈现为 -34 +(两个空格)。他们都将使用字段大小 5,但由于 - 而左对齐。

【讨论】:

  • 我是不是看错了规范?我想知道我是否读错了。
  • 我添加了一些关于如何正确理解规范的说明。
  • stackoverflow.com/questions/3779338/… 也可能是有用的阅读
  • 我确实了解规范的 + 和 - 是如何工作的。我想知道作者所说的“(空格)如果不写符号,则在值之前插入一个空格。”
  • 表示正数前面有空格,负数前面有-。
【解决方案2】:

更长且不太适合,但我认为它运行得更快。

您可以使用条件运算符更改prinf(或sprintf)的参数列表中的符号,而不是添加数学库。

#include <stdio.h>

int main(void)
{
    int n[3] = {-100, 0, 100};
    for (int i = 0; i < 3; ++i) {
        printf("%d\n", (n[i] < 0) ? -n[i] : n[i]);
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多