在C中打印多个可变数量的字符串

时间:2015-09-06 00:46:27

标签: c

我正在用C编写一个程序,首先提示用户输入一个整数,然后输出两个字符串:一个空格和一个变量号上的#,这样结果将是一个右侧金字塔,如下所示:

     #
    ##
   ###
  ####
 #####
######

我在for循环中存在的问题,这就是它的样子: (n是用户提示的整数)

for (int i = 0 ; i < n ; i++) 
{
    printf("%c",n-1,' ');  // printing the blank spaces gradually
    printf("%c\n",i+2,'#'); // printing the hashes gradually
}

这个想法是打印越来越少的空格和越来越多的散列,具体取决于int。

P.S:请考虑帮助我说出我的代码有什么问题,而不是给我一个真正的新工作。

3 个答案:

答案 0 :(得分:1)

首先,代码存在问题。它基于对printf的错误理解。 printf不能以代码中所需的方式使用。此外,即使这样做,也不会逐渐打印空间。因为你有固定的&n-1&#39;你可能意味着&#39; n-i&#39;所以它可以逐渐缩小。

无论如何,修复: 有许多解决方案,包括用新逻辑重写。但是,对于您的作业,代码仍然可以修复&#39;通过编写具有所需功能的printf变体。 e.g:

void mprintf(const char *fmt, int n, char c)
{
    while (n--)
   {
       printf("%c", c);
    }
 }

您的代码变为:

for (int i = 0 ; i < n ; i++)
{
    mprintf("%c",n-i,' ');  // printing the blank spaces gradually
    mprintf("%c",i,'#'); // printing the hashes gradually
    printf("\n");
}

额外信用: 了解如何通过删除某些无用的东西来简化此代码。

答案 1 :(得分:0)

你知道每一行都有相同数量的字符,计算空格和#,即n。在第一行中你只有一个#,所以n - 1个空格,第二行你有2个#,所以n - 2个空格,依此类推。所以你从0迭代到n - 1,并在每次迭代时打印一个char,你只需要计算你已经打印了多少个字符。开始打印空间,一旦打印出足够的空格,就打印#。代码:

for (int i = 0 ; i < n ; i++) 
{
    int j = 0;
    while (j < n)
    {
        if (j < n - i - 1)
             printf(" ");
        else
             printf("#");
        j++;
    }
    printf("\n");
}

答案 2 :(得分:0)

你说:

  

请考虑帮助我说出我的代码有什么问题,而不是给我一个真正的新工作。

忽略外观更改,您的循环体当前是:

T = me()
print T

问题包括:

  • for (int i = 0; i < n; i++) { printf("%c", n-1, ' '); // printing the blank spaces gradually printf("%c\n", i+2, '#'); // printing the hashes gradually } 来电的参数太多。
  • printf()需要一个参数,即要打印的字符。
  • 对于%c,您将打印 Control-E ,而不是第一次打印的任何空白。
  • 对于第二次打印,您将通过 Control-G 打印 Control-B 并且没有哈希值。

您可以使用:

n = 6

打印适当宽度的空白字段。但是,您不能使用printf("%.*s", n - i - 1, " "); 重复单个字符,因此您必须使用其他一些技术(例如使用printf()的循环)来打印适当数量的哈希值。

您应该阅读并重新阅读并重新阅读printf()的规范。我必须每年阅读几次才能保持最新状态;在给定的重读时,我通常会发现一些新的(或被遗忘的)。当然,我只用C编写了30年,这些年来规范已经改变了几次(并且它还没有变得更简单!),所以这并不是很令人惊讶。