【问题标题】:How to get a blank output for an integer from printf [closed]如何从 printf 获取整数的空白输出 [关闭]
【发布时间】:2024-01-06 14:41:01
【问题描述】:

当整数作为参数传递给它时,应该为整数分配什么值才能得到printf 显示的空白值作为回报?

虽然我为整数分配了一个空值,但它会打印 0

有人可以建议可以做些什么来实现这一目标吗?

谢谢

【问题讨论】:

  • 如果你想要一个空白的输出,不要使用printf,如果整数是0或者什么的就不要打印任何东西。
  • 您不能将 q null 值分配给 int。如果你有 int x = 0;你已经让 x 为零,而不是 null。
  • 我同意@not-Tony。此外,您将无法将整数打印出“空白”。它很可能会打印出 0 (如您所说)或内存中对象的引用。相反,这样做: if(num!=0){print.f("print whatever");}
  • 你能告诉我一个用空字符串表示的数字吗?我不能,你可能也不能。由于整数是数字,因此无法以这种方式实现您想要的。但是,如果您退后一步并描述您想要在更高层次上实现的目标,您可能会得到一些建议。另外,用所谓的“XY 问题”检查问题,我认为这正是你在这里所遇到的。

标签: c io int printf stdout


【解决方案1】:

“空白值”是(空)字符串,任何整数都不能产生空白值。

【讨论】:

    【解决方案2】:

    如果您指示printf() 打印一个整数,则没有空字符串表示的整数值。整数上下文中没有“空值”,C 中的 NULL 被明确定义为在指针上下文中的零值。在整数上下文中,0 只是一个值。至于应该做什么,使用条件测试来确定是否调用printf(),或者使用条件测试在使用printf()显示整数和使用printf()(或其他函数)显示之间进行选择一串适当长度的空格。

    【讨论】:

      【解决方案3】:

      printf 中的 %d 没有修饰符,为零时为空;但是,很明显,有时您希望在数字输出中为零输出空白,特别是输出许多为零的数字表。如果您设置使用 printf 执行此任务,则可以进行以下调整以在 int 值为零时允许空白。

      1   for (int i = 0; i < STOCKS; i++) {
      2     char cur_str[4] = "   ";
      3
      4     if (current_price[i]) sprintf(cur_str, "%+3d", current_price[i]);
      5
      6     printf(pcb[i+4], "%-15s%4d   %4s     %4d",
      7       stocks[i], ph[year-1][i], cur_str, ph[year][i]);    
      8   }
      

      向后工作: 第 6-7 行是 printf 语句,其中当前价格将使用 %4s 选项和相应的 cur_str 参数显示在第三列中

      第 4 行检查非零当前价格并使用 sprintf 生成正确的调整当前价格(当它不为零时)到 cur_str

      第 2 行默认 cur_str 为四个空格,列的宽度

      【讨论】:

        【解决方案4】:

        只需将整数转换为字符串,然后去掉(前导)零,然后将其提供给 printf:

        v1=42
        v2=0
        printf '%2s %2s\n' "${v1#0}" "${v2#0}"
        

        这为 v1 打印 42,为 v2 打印两个空白。 在 Bourne shell 或 Bash 中运行良好。

        【讨论】:

        • 问题不在于外壳。
        • printf 是 Bourne shell 的内置函数(除其他外)。
        【解决方案5】:

        如果有一个您100% 绝对知道永远不会在该上下文中使用的值,请将该值用作“空白”的含义并定义(并使用)print_int_with_blank() 函数

        #include <stdio.h>
        #define IMPOSSIBLE_VALUE 42
        int print_int_with_blank(char const *pre, int value, char const *post) {
            int n = 0;
            if (value != IMPOSSIBLE_VALUE) {
                n = printf("%s%d%s", pre, value, post);
            }
            return n;
        }
        

        你可以这样使用它

        #include <stdio.h>
        
        int main(void) {
            int a[10];
            for (int i = 0; i < 10; i++) {
                a[i] = 7 * i;
            }
            print_int_with_blank("", a[0], "");
            for (int i = 1; i < 10; i++) {
                print_int_with_blank(", ", a[i], "");
            }
            puts("");
        }
        

        demo at ideone

        【讨论】: