C程序不打印第一行(行)但打印所有其他行

时间:2016-08-10 09:32:37

标签: c printf

我正在尝试使用*打印倒金字塔(或三角形),但是当我运行以下代码时,跳过 for循环{{1} },即不打印任何i=rows, 第二次迭代顺利。我认为问题在*循环内,但我不清楚。

以下是代码:

while

2 个答案:

答案 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 -O2clang -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;
}