在C中删除输出末尾的空格

以下代码用于以螺旋顺序打印矩阵的元素。 该程序工作正常。 然而,问题是我正在检查程序的在线编译器不接受输出结尾的尾随空格。 谁能给我一些关于如何绕过输出中添加的最后一个空格的想法?

作为参考,我的代码如下(是的,变量名称很糟糕。我正在努力改变我放置随机变量名的习惯!!)

#include  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 = l; --i) printf("%d ", a[m-1][i]); m--; } if (l = 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的第一个问题!)

查看你的代码,这forwhile循环中的第一个):

 for (i = l; i < n; ++i) printf("%d ", a[k][i]); 

将始终至少执行一次(因为l ,来自while的条件)。

然后你可以做以下事情:

  • 始终在数字前添加空格
  • 添加一个if只检查这个第一次for -loop(使用一些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 (将避免缓存未命中)。

您可以在for循环中放置if条件

 for (i = l; i < n; ++i) { printf("%d", a[k][i]); if(i < n-1) printf(" "); } 

当您不需要时,您需要压缩空间。 你可以这样做:

添加这些声明:

 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, ...); 

在打印出任何内容之前,可以将布尔变量isFirst设置为true ,并在每个printf语句之前对其进行测试。 如果是isFirst ,请不要打印空格,而是将isFirst设置为false ; 否则打印一个空格。 之后,继续打印您的号码,没有空格。

替代方案:不是立即打印结果,而是创建results数组。 将结果存储在那里,完成后,将结果打印出来。 您可以打印没有前导空格的第一个数字,然后循环其余部分并使用前导空格打印它们。

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++; } 

接受答案后的答案:

而不是:

 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.