在 c 中打印形状 x 次

Print shape x times in c

我正在尝试水平打印此箭头形状乘以第一个参数的数量。 现在它正在工作,但代码似乎很多余..必须有更好的方法..请帮忙?

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
    int i; 
    int a;
    a = strtol(argv[1], NULL, 0);
    for (i=0; i<a; ++i) {
        printf("   *   ");
    }
    printf("\n");
    for (i=0; i<a; ++i) {
        printf("  ***  ");\
    }

    printf("\n");
    for (i=0; i<a; ++i) {
        printf(" ***** ");
    }

    printf("\n");

    for (i=0; i<a; ++i) {
        printf("*******");
    }

    printf("\n");

    for (i=0; i<a; ++i) {
        printf("  ***  ");
    }

    printf("\n");

    for (i=0; i<a; ++i) { 
        printf("  ***  ");
    }

    printf("\n");

    for (i=0; i<a; ++i) {
        printf("  ***  ");
    }

    printf("\n");



 return 0;
}

当前输出如下所示:

./a.out 3
   *      *      *   
  ***    ***    ***  
 *****  *****  ***** 
*********************
  ***    ***    ***  
  ***    ***    ***  
  ***    ***    *** 

当您的代码自行重复时,很可能是您遗漏了一个循环。当您的 "would-be-loop" 使用的数据在迭代中过于不同时,数组通常会有所帮助。

您可以创建一个 C 字符串数组,并从中添加一个额外的循环打印字符串:

char *arrow[] = {
    "   *   ",
    "  ***  ",
    " ***** ",
    "*******",
    "  ***  ",
    "  ***  ",
};
for (int r = 0 ; r != 6 ; r++) {
    for (int i = 0 ; i != 3 ; i++) {
        printf("%s", arrow[r]);
    }
    printf("\n");
}

Demo.

您可以编写一个简单的函数来包装 printf 以及您的循环。例如:

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

int xprintf(int x, const char *format, ...) {
    assert(x >= 0);
    int result = 0;

    va_list args;
    va_start(args, format);
    for (int i=0; i<x; ++i) {
        int ret = printf(format, args);
        // Return early in case of error.
        if (ret < 0)
            return ret;
        // Sum all written bytes.
        result += ret;
    }
    va_end(args);

    return result;
}

int main(int argc, char** argv) {
    assert(argc == 2);

    int x = strtol(argv[1], NULL, 0);
    xprintf(x, "   *   "); printf("\n");
    xprintf(x, "  ***  "); printf("\n");
    xprintf(x, " ***** "); printf("\n");
    xprintf(x, "*******"); printf("\n");
    xprintf(x, "  ***  "); printf("\n");
    xprintf(x, "  ***  "); printf("\n");
    xprintf(x, "  ***  "); printf("\n");

    return 0;
}