在 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");
}
您可以编写一个简单的函数来包装 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;
}
我正在尝试水平打印此箭头形状乘以第一个参数的数量。 现在它正在工作,但代码似乎很多余..必须有更好的方法..请帮忙?
#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");
}
您可以编写一个简单的函数来包装 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;
}