我目前遇到这个问题。我想按照我在下面的代码块中定义的那样打印#
,事实是当我将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
答案 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;
}