我正在进行练习,从C程序中绘制一个三角形。用户在命令行中输入三角形的高度,三角形用“*”s打印。
例如,输入3将输出:
*
***
*****
这是我到目前为止所做的:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[]) {
//initialize height variable and bottom variable
int height, limit;
//take command line argument and save it as an int. This ensures
height = atoi(argv[1]);
printf("You have chosen to draw a triangle of height: %d\n", height);
if (height<1) {
printf("ERROR: Height too small.\n");
exit(1);
}
else if (height>100) {
printf("ERROR: Height too large.\n");
exit(1);
}
for (int i = 1; i <= height; i++)
{
limit=0;
// this 'for' loop will take care of printing the blank spaces
for (int j = 1; j <= height; j++)
{
printf(" ");
}
//This while loop actually prints the "*"s of the triangle.
while(limit!=2*i-1) {
printf("*");
limit++;
}
limit=0;
//We print a new line and start the loop again
printf("\n");
}
return 0;
}
我有两个问题:
这是我程序的当前输出:
*
***
*****
答案 0 :(得分:2)
打印前导空格的循环始终每次打印相同数量的空格。您需要在每个后续行上打印1个更少的空间。您可以通过使用j=i
而不是j=1
启动循环来完成此操作。
不使用atoi()
,而是使用strtol()
,如下所示:
char *p;
errno = 0 ;
height = strtol(argv[1], &p, 10);
if (errno != 0 || p == argv[1]) {
printf("invalid input");
exit(1);
}
如果解析时出错,errno
将设置为非零值。返回时的p
参数将指向不是数字的第一个字符。因此,如果它指向字符串的开头,则它不是数字。
另外,请务必检查argv[1]
是否确实存在:
if (argc < 2) {
printf("not enough arguments\n");
exit(1);
}
答案 1 :(得分:0)
我发现,虽然没有必要,但最好还是给你的初始值。当程序变大时,可能会导致非常烦人的错误。同时在开头定义你的i和j。
int height = 0;
int limit = 0;
int i = 0;
int j = 0;
每次j应该是不同的值。例如:
for(j = i; j <= height; j++)
{
printf(" ");
}
至于字母或数字部分,您可能需要查看isdigit函数:http://www.tutorialspoint.com/c_standard_library/c_function_isdigit.htm
答案 2 :(得分:0)
可能有20种方法可以做到这一点。关键是要意识到当你将间距减少1时你必须将'*'
的数量增加2:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SLIMIT 120
int main (int argc, char **argv) {
size_t height = argc > 1 ? atoi (argv[1]) * 2: 12;
size_t space;
size_t i;
if (height < 1) {
fprintf (stderr, "error: invalid height '%zu'\n", height);
return 1;
}
space = (height + 1)/2;
for (i = 1; i < height+1; i+=2,space--) {
char tstring[SLIMIT+1] = {0};
memset (tstring, '*', i);
printf ("%*s%s\n", space, " ", tstring);
}
return 0;
}
示例输出
$ ./bin/triangle 12
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************
*********************
***********************
注意:目前仅限于宽度60(1/2 SLIMIT
)。