我正在尝试使用*
打印倒金字塔(或三角形),但是当我运行以下代码时,跳过 for
循环{{1} },即不打印任何i=rows
,
第二次迭代顺利。我认为问题在*
循环内,但我不清楚。
以下是代码:
while
答案 0 :(得分:4)
程序无法正常工作,因为代码中有未定义的行为,因为在初始化之前使用了未初始化的变量k
。
未初始化的变量具有 indeterminate 值,并且使用它们(初始化变量除外)是未定义的行为。
您应该在使用之前初始化k
,而不仅仅是在外部循环结束时。像
for(i=rows,k=0; i>=1; i--,k=0)
// ^^^^
// Added initial initialization
或 ,因为除了k
循环之外你没有使用while
,为什么不把它变成for
环?像
for (int k = 0; k < 2 * i - 1; ++k)
printf("* ");
答案 1 :(得分:2)
您只在k
循环的增量部分初始化for
...因此k
在第一次迭代时未初始化。它碰巧有0
或负值,但其初始值实际上是不确定的:程序调用未定义的行为。
如果使用gcc -Wall -W -O2
或clang -Weverything -O2
进行编译,编译器会向您发出警告。
你应该总是使用标准习语,这有助于避免这种错误。
以下是改进版本:
#include <stdio.h>
int main(void) {
int k, i, space, rows;
printf("Enter the number of rows: ");
if (scanf("%d", &rows) != 1)
return 1;
printf("\n");
for (i = rows; i > 0; i--) {
for (space = 0; space < rows - i; space++) {
printf(" ");
}
printf("smth");
for (k = 0; k < 2 * i - 1; k++) {
printf("* ");
}
printf("\n");
}
return 0;
}