格式说明符Q和Mario解决方案到金字塔算法的唯一错误

时间:2014-08-01 22:13:14

标签: c printf

好吧,我对这个问题的解决方案有两个问题,我希望能得到一些帮助。问题本身就是能够根据用户输入以特定格式打印#s。

我的问题是:

  1. 当我输入7时,它输出正确的解决方案,但当我输出8(或更高)时,我的缓冲区,无论出于何种原因在最后添加一些垃圾,我不确定为什么会发生。我会添加一张图片,但我没有足够的代表点:(

  2. 在我的代码中,我输入了 ** HELPHERE ** ,我不确定为什么这给了我正确的解决方案。我很困惑,因为在我读过的链接中(格式说明符)我认为1输入(在我的情况下是x)指定了你想要的空格数。我认为这将使解决方案x-n成为每个后续行,你需要每次减少1个空间段。我是否理解数组以某种方式将其输入反转为printf语句?我很困惑,因为这意味着因为数组增加1,在循环的每次后续迭代中,它会进入空间区域吗?

  3. int main(void){
    
        printf("Height: ");
        int x = GetInt();
        int n = 1;
        int k=0;
        char buff[x];           /* creates buffer where hashes will go*/
    
        while(n<=x){            /* stops when getint value is hit*/
            while(k<n)              /* fill buffer on each iteration of loop with 1 more     hashtag*/
            {
                buff[k] = '#';
                k++;
            }
    
            printf("%*s",x, buff);  /*makes x number of spaces ****HELPHERE*****, then prints buffer*/
            printf("  ");
            printf("%s\n",buff);    /*prints other side of triangle */
    
            /*printf("%*c \n",x-n, '\0');*/
    
            n++;
        }
    
    }
    

2 个答案:

答案 0 :(得分:0)

  1. 分配足够的内存并确保字符串为空终止:

    char buff[x+1];//need +1 for End of the string('\0')
    memset(buff, '\0', sizeof(buff));//Must be initialized by zero
    
  2. 按空白填充空字符串的要求打印尽可能多的空白:

    printf("%*s", x, "");
    
  3. ※第二项是Jonathan Leffler写的。

答案 1 :(得分:0)

printf("%*s",x, buff);中,buff非空字符终止。

现在代码&#34;工作&#34;有时候buff未正确终止,结果是UB - 未定义的行为。在OP的案例中可能发生的事情是,缓冲区大小为7,幸运的是在后续字节中有'\0',但当大小为8时则不是这样。

1)根据@BLUEPIXY,分配了足够大的缓冲区以容纳'#' 终止'\0' char buff[x+1];

2)更改while循环以附加所需的'\0'

while (k<n) {
  buff[k] = '#';
  k++;
  }
buff[k] = '\0';

3)轻微:确保x有效。

 if (x < 0) Handle_Error();
 char buff[x]; 

4)轻微:返回int main()的值,例如return 0;