printf函数字符串printout参数用法

时间:2017-02-20 22:09:24

标签: c

我目前遇到这个问题。我想按照我在下面的代码块中定义的那样打印#,事实是当我将printf参数作为printf("%*s\n", x, BORDER)传递时,它打印出所有#我在开头定义。但是,当我将其写为printf("%.*s\n", x, BORDER)时,它会打印出与我想要的#一样多的#include <stdio.h> #include <string.h> #define BORDER "############################################" int main(void) { char word[26]; int x; scanf("%25s", word); x = strlen(word) + 2; printf("x = %d\n", x); printf("%*s\n", x, BORDER); printf("#%s#\n", word); printf("%*s\n", x, BORDER); return 0; } 。有人能告诉我引发这个问题的区别是什么?我知道宽度和精度在浮点数打印输出方面起着重要作用,但这是字符串打印出来的......

var dec = new decimal(123.123456);
dec.ToString("0.#"); // will output 123.1 or 123 if there is no decimal value
dec.ToString("0.0"); // will output 123.1 or 123.0 if there is no decimal value

1 个答案:

答案 0 :(得分:2)

以下是两种语法之间的区别:

  • 使用%*s传递的可选字段宽度指定要为字符串打印的最小宽度。如果字符串较短,则在字符串之前将打印额外的空格。

  • %.*s一起传递的可选精度指定要从字符串参数中打印的最大字符数。

在您的情况下,您希望限制要从BORDER字符串打印的字符数,因此您应该使用%.*s格式:

printf("%.*s\n", x, BORDER);

但是请注意,这种方法并不通用,因为您必须保持BORDER的定义与数组大小同步。

这是一种不同的方法:

#include <stdio.h>
#include <string.h>

int main(void) {
    char word[26];

    if (scanf("%25s", word) == 1) {
        int x = strlen(word) + 2;
        char border[x + 2];

        memset(border, '#', x);
        border[x] = '\0';

        printf("x = %d\n", x);
        printf("%s\n#%s#\n%s\n", border, x, border);
    }    
    return 0;
}