【问题标题】:Printing partial char arrays...with a twist打印部分字符数组......有点扭曲
【发布时间】:2013-01-13 22:45:04
【问题描述】:

所以我知道有很多关于在 C 中仅打印 char 数组段的问题,我已经阅读了它们,虽然我的问题本质上是相似的,但我的问题有一个小转折。鉴于下面的代码,我如何只打印出fmt 数组的前四个字符?我不允许更改fmt,因此我必须使用VAL 来指定我只想打印值、新行和一个空格。

#define VAL 4
int main() {
   char fmt[10] = "%d\n   ";
   int value = 1;
   printf(fmt, value);
}

编辑:

这只是我代码的一小部分,因为我觉得这就是所有必要的。如果需要更多,我将提供我的其余代码。

EDIT2:

限制: 没有新变量 & 必须使用 VAL 来指定要打印多少 fmt 数组。

EDIT3(完整问题):

填写程序中缺少的部分,不添加任何变量声明。要求用户选择他/她想要如何打印输入的整数值。 (如果您不知道所有整数格式说明符,请查找 printf 的整数格式说明符。)使用指定的格式说明符字母打印之前输入的整数,然后返回,然后再次提示输入另一个格式字母(尽管不是新整数)。 低于复杂性限制是挑战的主要部分。灵活选择哪种循环类型,以及如何读取格式说明符字符。另外,请注意,如果格式字符串中的 %c 之前有空格,则 scanf 在读取字符时会跳过空格。而且,该 VAL 定义有一个重要用途,包括消除输出中的虚假空白。最后,甚至不要考虑使用大开关或 if-else 块来执行此操作。

#include <stdio.h>
#define VAL 4  // You might want this

int main() {
   char fmt[10] = "%d\n   "; // Quickly initializes fmt array 
   int value;

   printf("Enter an integer: ");
   scanf("%d", &value);
   //from here below is my code, above code is pre-provided
   printf("Enter a format specifier (x, X, c, d, i, o, or q to quit): ");
   scanf(" %c", &fmt[1]);

   while (fmt[1] != 'q') {
      printf("%4s", fmt, value);
      printf("Enter a format specifier (x, X, c, d, i, o, or q to quit): ");
      scanf(" %c", &fmt[1]);
   }
}

【问题讨论】:

    标签: c string printf arrays


    【解决方案1】:

    如何只打印我的 fmt 数组的前四个字符

    怎么样:

    printf("%4s", fmt);
    

    它不起作用,因为我需要变量值来告诉 %d in fmt 打印什么

    选项:

    • 使用4 的长度打印到单独的字符串 (snprintf)
    • 处理您的号码,直到它包含适当的位数,然后打印

    【讨论】:

    • 它不起作用,因为我需要变量值来告诉 fmt 中的 %d 要打印什么。
    • 我应该更具体地说明我的规格,抱歉。我不允许创建任何新变量。给我的练习的重点是使用 VAL 定义来指定我想要打印多少 char 数组。
    • @Mike 如果您无法创建新变量(并且您提到fmt 无法更改),这可能是不可能的或非常非常困难。我认为这可能是不可能的,但我没有心情争论。
    • @Mike 你可能读错了。你能编辑你的问题并提供练习的原文吗?
    • @Mike 但是你总是可以说fmt[VAL] = 0
    【解决方案2】:

    添加到 cnicutars 非常好的答案,我只想指出,如果数组不是 const,你可以改变它:

    char saved = fmt[4];
    fmt[4] = '\0';
    printf (fmt, value);
    fmt[4] = saved;
    

    编辑

    正如我在原始问题中指定的那样,数组无法更改。

    是的,好吧...我误读并认为无法更改原始 const 格式字符串。不过,我认为这些信息可能对其他人有用。

    【讨论】:

    • 正如我在原始问题中指定的那样,数组无法更改。
    • @Mike 你确定是数组不能改变,而不是原始文字吗?
    • @Mike,原来的问题用scanf改变了数组
    • 抱歉,给您带来的困惑。但是,我尝试了您的一些代码,并对我的规范进行了一些更改,它可以工作。非常感谢。
    【解决方案3】:

    从输入读取值后,打印可能是:

    printf("%.*s", VAL, fmt, value);
    

    【讨论】:

    • 虽然这是一个很酷的格式规范,但请注意 printf 将忽略 value 并打印 "%d\n "
    猜你喜欢
    • 2020-10-19
    • 2021-01-24
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2018-03-25
    • 1970-01-01
    • 2018-02-06
    相关资源
    最近更新 更多