我正在尝试制作一个将字符串数组打印为三角形的程序。我看过网上,只能找到一个数字数组,当我编码时,打印出一个垂直线,如下面的输出所示。我是编程的新手,所以请善待。我正在寻找这种类型的三角形。
m y n a m
e i s b
r a n
d o
n
我的代码是:
#define CHAR 25
main()
{
char string[CHAR] = "";
int i = 0, k = 0, j = 0;
printf("Please enter your name\n");
printf("**********************\n\n");
fgets(string, CHAR, stdin);
puts(string);
pause;
cls;
for (i = 1; i <= CHAR; i++)//start of triangle
{
for (j = 1; j < i; j++)
printf(" ");
for (k = i; k <= CHAR; k++){
printf("%c ", string[i]);
printf("\n");
}
}//end of triangle
对于这样一个愚蠢的问题,我很可能会得到一个糟糕的评价,但任何方向都会很棒。即使它是“嘿白痴你为什么这样做......”感谢所有的帮助!
这是输出
,即字符串名称为'tom'
输出:
o
o
o
o
o
m
m
m
m
然后是暂停上方的一个奇怪的符号字符。我显然无法发布图片,但这就是它的表现。
答案 0 :(得分:1)
您的代码存在一些问题,尽管您似乎处于正确的轨道上。首先,请咨询printf
man pages以获取正确的转换说明符。通常,如果您的格式字符串与您的参数不匹配,则为undefined behavior。你需要在两个地方改变它:
%d
应为%zu
,因为您正在处理size_t
。
printf("The size of the string is %zu\n", strlen(string));
并且您想要打印一个字符,而不是字符串。
printf("%c ", string[i]);
此外,您正在尝试访问具有char类型的数组,而不是int类型。更改这些声明:
char string[CHAR] = ""; int i = 0, k = 0, j = 0;
现在解决你的问题。首先,您正在读取可能包含空格的字符串,但您不会考虑这一点。一种相当低效的方法是在打印三角形之前从字符串中删除空格。更好的方法是忽略这些空格,即:
if (string[j] == ' ')
// don't print them
其次,你的外部循环可能会超出数组访问范围:
for (i = 1; i <= CHAR; i++)//start of triangle
{
过度简化的方法可能如下:
int line_width = 6;
for (i = 0; i < line_width; i++)
{
for (s = 0; s < i; ++s)
printf(" ");
for (k = i; k < line_width - 1; ++k)
{
if (string[j] == ' ')
++j;
printf("%c ", string[j]);
++j;
}
printf("\n");
}