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

时间:2014-03-24 14:35:33

标签: c whitespace

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

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

#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的问题!)

6 个答案:

答案 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)

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

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.