好吧,我对这个问题的解决方案有两个问题,我希望能得到一些帮助。问题本身就是能够根据用户输入以特定格式打印#s。
我的问题是:
当我输入7时,它输出正确的解决方案,但当我输出8(或更高)时,我的缓冲区,无论出于何种原因在最后添加一些垃圾,我不确定为什么会发生。我会添加一张图片,但我没有足够的代表点:(
在我的代码中,我输入了 ** HELPHERE ** ,我不确定为什么这给了我正确的解决方案。我很困惑,因为在我读过的链接中(格式说明符)我认为1输入(在我的情况下是x)指定了你想要的空格数。我认为这将使解决方案x-n成为每个后续行,你需要每次减少1个空间段。我是否理解数组以某种方式将其输入反转为printf语句?我很困惑,因为这意味着因为数组增加1,在循环的每次后续迭代中,它会进入空间区域吗?
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++;
}
}
答案 0 :(得分:0)
分配足够的内存并确保字符串为空终止:
char buff[x+1];//need +1 for End of the string('\0')
memset(buff, '\0', sizeof(buff));//Must be initialized by zero
按空白填充空字符串的要求打印尽可能多的空白:
printf("%*s", x, "");
※第二项是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;
。