我也想知道为什么我的输出搞乱了。代码如下。我是初学者,所以请原谅我缺乏技巧。任何帮助将不胜感激。
#include <stdio.h>
int main(int argc, char *argv[])
{
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= i; j++)
{
printf("*");
}
printf("\t");
for (int k = 1; k <= 11-i; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
给出以下输出:
答案 0 :(得分:30)
Hello
停在下一个可到达的标签位置,默认情况下为8的倍数。
因此,如果您打印\t
,它将跳到第8列,但是如果您打印***
,您已经是第8列,那么它将跳到第16列。
答案 1 :(得分:13)
精度和宽度字段可用于格式化。 Precision将最多打印指定数量的字符,而width将至少打印指定数量的字符。在任一字段中都使用星号可为可变数量的字符提供参数。
#include <stdio.h>
int main( void) {
char asterisk[] = "***********";
for (int i = 1; i <= 10; i++)
{
printf ( "%.*s", i, asterisk);//print up to i characters
printf ( "%*s", 15 - i, " ");//print at least 15 - i characters
printf ( "%.*s", 11 - i, asterisk);
printf("\n");
}
return 0;
}
答案 2 :(得分:13)
...为什么我的输出混乱了(?)
代码使用制表符'\t'
,该制表符仅与下一个制表符对齐-通常每8列,所需的星号超过8。
明智地使用'-'
标志 ,字段宽度和 precision ,可以简化代码以打印出字符。
#include <stdio.h>
#include <string.h>
int main(void) {
int n = 10;
char stars[n];
memset(stars, '*', n);
for (int i = 0; i < n; i++) {
// +------------- - flag: pad on right
// |+------------ field width: min characters to print, pad with spaces
// || +--------+- precision: max numbers of characters of the array to print
printf("%-*.*s %.*s\n", n, i + 1, stars, n - i, stars);
// | ^^^^^ ^^^^^ precision
// +--------------------- field width
}
}
输出
* **********
** *********
*** ********
**** *******
***** ******
****** *****
******* ****
******** ***
********* **
********** *
注意:stars
不是字符串,因为它缺少空字符。对"%s"
使用精度可以使printf()
使用简单的字符数组。数组中的字符被写到(但不包括)一个终止的空字符。
答案 3 :(得分:8)
制表位不是固定宽度的空格(例如,等于4个空格或8个空格),这意味着输出设备应将插入号(或打印头)移动到表格数据的下一个列位置。这些列位置以固定的固定间隔,这就是\t**
和**\t
具有不同的打印宽度的原因:
String Output:
"\t**a" " **a" (7 wide)
"**\ta" "** a" (5 wide)
答案 4 :(得分:4)
正如其他人所提到的那样,打印制表符将光标移动到下一个制表位,而不是一定的空格。
在打印了第一组星号之后,请打印空格,直到您打印了足够的字符以按需要隔开为止。
for (int j = 1; j <= 10; j++)
{
if (j<i) {
printf("*");
} else {
printf(" ");
}
}
答案 5 :(得分:2)
我会这样:
const int rows = 10;
for (int i = 0; i < rows; i++) {
const int width = 10;
const int space = 5;
const int totalw = 2*width + space;
for (int j = 0; j < totalw; j++) {
char ch = j<=i || (j>=width+space && j<(totalw-i)) ? '*' : ' ';
printf("%c", ch);
}
printf("\n");
}
仅出于完整性考虑,即使在其他答案中也提到过。 '\t'
字符没有固定宽度。