2014-03-24 34 views
0

以下代碼用於按螺旋順序打印矩陣的元素。該程序正常工作。然而,問題在於,我正在檢查程序的在線編譯器不接受輸出結尾處的尾隨空格。任何人都可以給我一些想法,以瞭解如何解決輸出中添加的最後一個空白區域?刪除輸出結尾處的空格C

僅供參考,我的代碼如下(是變量名是可怕的我正在改變我的推杆隨機變量名的習慣!)

#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} 

任何方式來解決這個問題呢? (亦作可怕的格式抱歉。在計算器上首先的問題!)

+0

您在'printf'語句中在上述程序中添加了空格。 –

+0

使用printf(「%d」,a [i] [j])。簡單地把空間放在之前而不是之後。您也可以使用\ b作爲退格。 – SiMemon

+0

@dreamer是的。並且在printf語句中沒有空格的情況下,它會將輸出打印爲123698745.我確實希望保留兩者之間的空格。它最終添加的一個空間會影響編譯器。 – n0x3u5

回答

0

看你的代碼,這for(在while循環中的第一個):

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

總是至少那些被執行(因爲l<n ,來自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只有一次(將避免高速緩存未命中)。

+1

是的!這真的很高雅!謝謝!我正在考慮創建一個新的數組來放置結果,然後在最後打印數組,或者在每個printf語句之前添加一個檢查。但這要好得多。謝謝! – n0x3u5

+0

@ n0x3u5 - 不客氣:)。 –

3

你可以把一個if條件在for循環

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

我不認爲這將適用於5X5或更大的輸入。 –

+0

@KlasLindbäck;爲什麼不? – haccks

+1

它會多次壓縮空間,因爲while循環現在會循環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++; 
     } 
+0

然後在開始時會有一個額外的空間。 – haccks

0

在打印出任何東西之前,您可以設置一個布爾變量isFirsttrue,並在每個printf語句之前對其進行測試。如果isFirst,請勿打印空間,但請將isFirst設置爲false;否則打印一個空格。之後,繼續打印您的號碼,無需空格。

替代方法:不要立即打印結果,而應創建一個results數組。將結果存儲在那裏,完成後,以緊密的方式打印結果。您可以打印第一個號碼而不用的前導空格,然後循環打印剩下的部分並將其打印,其中爲主要空格。

+0

是的。我已經考慮過使用替代解決方案了。不過我會盡量先用條件檢查來做。謝謝! – n0x3u5

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:■使用新的變量:

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