2015-09-06 39 views
0

我正在用C编写一个程序,首先提示用户输入一个整数,然后输出两个字符串:一个空格和一个变量编号,以便结果是一个正确的棱锥,像这样:Printf 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:请考虑帮我说我的代码有什么问题,而不是给我一个实际的新工作。

+1

欢迎来到堆栈溢出!不幸的是,这不是一个好的问题,这不是一个家庭作业帮助网站,虽然你可以找到很多信息,可以帮助你在这里做你的功课。作为发布代码的一般规则,您需要将其格式化为代码,您需要说明具体的错误消息/问题是什么,并且通常您需要给出一个最简单的工作示例。您应该查看帮助中心的问题指南,以便您知道什么是将来发布的合适问题。 (这个很可能会被关闭,我很抱歉地说。) –

+1

这两个'printf'调用实际上都会打印一次'(char)(n-1)'或'(char)(i + 2)'的值并忽略了其余的论点。无论使用什么makefile,只要你的编译器支持它(或者调查你的编译器提供的警告/警告级别选项)和'-Wextra',你应该至少在你的'cc'行中包含'-Wall'如果可能的话。这会在当前捕获很多编码错误,例如未使用的'printf'参数。一个常见的解决方案是在当前循环中打印'n-i-1'空格的循环,之后再打印另一个循环以打印'#''i'次。 –

+0

我已经从与问题没有直接关系的问题中删除了一些额外的东西,并且还添加了我认为您希望输出看起来像的内容。 (如果我错了,请修复它!) – immibis

回答

0

你知道每行都有相同数量的字符,计数空格和#,这是n。在第一行中,你只有一个#,所以n-1个空格,第二行中有2个#,所以n-2个空格,等等。所以你从0迭代到n - 1,并且每次迭代都会打印一个字符,并且你只需要记录已经打印了多少个字符。开始打印空格,一旦打印出足够的空格,就打印一个#。代码:

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

首先,代码的问题。它基于对printf的错误理解。 printf不能以代码中所需的方式使用。而且,即使这样做了,它也不会因为你已经固定'n-1'而逐渐打印空间。你可能意思是'n-i',所以它可以逐渐缩小。

无论如何,要解决: 有很多解决方案,包括用新逻辑重写。尽管如此,您仍然可以通过编写自己的具有所需功能的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"); 
} 

附加题: 了解如何通过删除某些无用的东西简化该代码。

0

你说:

请考虑说什么是错我的代码,而不是给我一个实际的新的工作一个帮助我。

忽略表面的改变,你的循环体目前:

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需要一个参数,即要打印的字符。
  • 对于n = 6,您将打印Control-E而不是第一次打印的任何空白。
  • 对于第二次打印,您将会打印Control-BControl-G并且没有散列。

你可以使用:

printf("%.*s", n - i - 1, " "); 

打印适当宽度的空白的领域。但是,您不能使用printf()重复单个字符,因此您必须使用其他技术(例如使用putchar()的循环)来打印适当数量的散列。

您应该阅读并重新阅读并重新阅读printf()的规范。我必须每年阅读几次才能尝试并保持最新状态;我通常会在给定的重新阅读中找到新的(或被遗忘的)。当然,我只用C语言编写了30年,并且规范多年来发生了几次变化(而且它还没有变得更简单!),所以这并不令人惊讶。