以下代码用于以螺旋顺序打印矩阵的元素。该程序工作正常。然而,问题是我正在检查程序的在线编译器不接受输出结尾处的尾随空格。谁能给我一些关于如何绕过输出中添加的最后一个空格的想法?
作为参考,我的代码如下(是的,变量名称很糟糕。我正在努力改变我随机变量名称的习惯!!)
#include <stdio.h>
int main()
{
int a[6][6];
int i, k = 0, l = 0, m=3, n=3, j;
scanf("%d %d",&m, &n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
while (k < m && l < n)
{
for (i = l; i < n; ++i)
printf("%d ", a[k][i]);
k++;
for (i = k; i < m; ++i)
printf("%d ", a[i][n-1]);
n--;
if ( k < m)
{
for (i = n-1; i >= l; --i)
printf("%d ", a[m-1][i]);
m--;
}
if (l < n)
{
for (i = m-1; i >= k; --i)
printf("%d ", a[i][l]);
l++;
}
}
return 0;
}
输入:
1 2 3
4 5 6
7 8 9
输出:
1 2 3 6 9 8 7 4 5{one extra space}
有什么方法可以解决这个问题吗? (对于可怕的格式化也很抱歉。第一个关于StackOverflow的问题!)
答案 0 :(得分:3)
您可以在if
循环中添加for
条件
for (i = l; i < n; ++i)
{
printf("%d", a[k][i]);
if(i < n-1)
printf(" ");
}
答案 1 :(得分:2)
当你不需要时,你需要压缩空间。 你可以这样做:
添加这些声明:
char *format = "%d";
int first_number = 1;
在第一个printf之后添加:
if (first_number) {
/* Now we want a space between numbers */
first_number = 0;
format = " %d";
}
更改printf:s以使用新变量:
printf(format, ...);
答案 2 :(得分:0)
printf()语句,
printf("%d ", a[k][i]);
会产生额外的空间。使用
“%d” 没有空间或在开头使用空间,
" %d"
然后最后不会有额外的空间
它是关于如何在printf()中使用空间的。如果你想要的话,在末端不存在额外空间的方式使用空间。
你可以使用这样的代码,
while (k < m && l < n)
{
for (i = l; i < n; ++i)
{
if(l==0&&i==0)
{
printf("%d", a[k][i]);
}
else
printf(" %d", a[k][i]);
}
k++;
for (i = k; i < m; ++i)
printf(" %d", a[i][n-1]);
n--;
if ( k < m)
{
for (i = n-1; i >= l; --i)
printf(" %d", a[m-1][i]);
m--;
}
if (l < n)
{
for (i = m-1; i >= k; --i)
printf(" %d", a[i][l]);
l++;
}
答案 3 :(得分:0)
查看您的代码,for
(while
循环中的第一个):
for (i = l; i < n; ++i)
printf("%d ", a[k][i]);
将始终至少执行一次(因为l<n
来自while
的条件)。
然后您可以执行以下操作:
if
循环添加一个for
检查(使用一些bool
标记)。例如:
bool first = true;
while (k < m && l < n)
{
for (i = l; i < n; ++i)
{
if( ! first )
{
printf(" %d", a[k][i]);
}
else
{
printf("%d", a[k][i]);
first = false;
}
}
// ....
}
这将是一个相当有效和简短的解决方案 - if
只在一个循环中,标志只有true
一次(将避免缓存未命中)。
答案 4 :(得分:0)
您可以在打印任何内容之前将布尔变量isFirst
设置为true
,并在每个printf
语句之前对其进行测试。如果isFirst
,请不要打印空格,而是将isFirst
设置为false
;否则打印一个空格。之后,继续打印您的号码,没有空格。
替代方法:不要立即打印结果,而是创建一个results
数组。将结果存储在那里,完成后,将结果打印出来。您可以打印第一个数字而不一个前导空格,然后循环覆盖其余部分并使用前导空格打印它们。
答案 5 :(得分:0)
接受回答后的回答:
而不是:
while (k < m && l < n) {
...
printf("%d ", a[k][i]);
...
printf("%d ", a[i][n-1]);
...
printf("%d ", a[m-1][i]);
...
printf("%d ", a[i][l]);
...
}
更改格式。
const char *format = "%d";
while (k < m && l < n) {
...
printf(format, a[k][i]);
format = " %d";
...
printf(format, a[i][n-1]);
...
printf(format, a[m-1][i]);
...
printf(format, a[i][l]);
...
}
fputc('\n', stdout); // if desired.