2014-12-01 49 views
2

如何控制標籤位置以正確縮進作爲輸入提供的一段代碼?控制標籤位置以便在輸出中正確縮進

我使用括號中的計數器來設置適當的縮進量(例如,如果第一個{位於位置1,則下一個應位於位置9)。

這裏是我的代碼:

#include <stdio.h> 
#include <stdlib.h> 

main() { 
    int ch; 
    ch = getchar(); 
    int lbcounter = 0; // Left curly bracket counter 
    int rbcounter = 0; // Right curly bracket counter 
    while (ch != EOF) { 
    if (ch != ';' && ch != '{' && ch!= '}') { 
     putchar(ch); 
    } 
    if (ch == ';') { 
     putchar(ch); 
     putchar('\n'); 
    } 
    if (ch == '{') { 
     putchar('\n'); 
     if(lbcounter == 0) { 
     putchar('\n'); 
     lbcounter++; 
     putchar(ch); 
     putchar('\n'); 
     } else { 
     putchar('\t'); 
     lbcounter++; 
     putchar(ch); 
     putchar('\n'); 
     } 
    } 
    if (ch == '}') { 
     putchar('\n'); 
     if(rbcounter == 0) { 
     putchar('\t'); 
     rbcounter++; 
     putchar(ch); 
     putchar('\n'); 
     } else { 
     putchar('\n'); 
     rbcounter++; 
     putchar(ch); 
     putchar('\n'); 
     } 
    } 
    ch = getchar(); 
    } 
} 

例如,對於下面的輸入:

int main(void){{{{{{{;;(void)((((0))));;return 0;}}}}}}} 

我們期待以下的輸出:

int main(void) 
{ 
    { 
     { 
      { 
       { 
        { 
         { 
          ; 
          ; 
          (void)((((0)))); 
          ; 
          return 0; 
         } 
        } 
       } 
      } 
     } 
    } 
} 

但實際產量爲:

int main(void) 

{ 

    { 

    { 

    { 

    { 

    { 

    { 
; 
    ; 
    (void)((((0)))); 
    ; 
    return 0; 

    } 


} 


} 


} 


} 


} 


} 

總結:每次從輸入中讀取左花括號時,我想將縮進量增加一個\t - 除非它是第一個,在這種情況下,我只想插入一個換行符。

當讀取第一個右括號括號時,我想讓它匹配最後一個左括號的位置。每次讀取新的右括號時,縮進應該減少一個\t

回答

2
#include <stdio.h> 

int main(){ 
    int ch; 
    int bcounter=0; /* bracket counter */ 
    int topOfLine = 1; 

    while((ch=getchar()) != EOF){ 
     if(ch == '{' || ch == '}'){ 
      if(!topOfLine) 
       putchar('\n'); 
      topOfLine = 1; 
     } 
     if(ch == '}'){ 
      --bcounter; 
     } 
     if(0 < bcounter && topOfLine){ 
      int i; 
      for(i = 0; i < bcounter; ++i) 
       putchar('\t'); 
     } 
     putchar(ch); 
     topOfLine = 0; 
     if(ch == '{' || ch == ';'){ 
      putchar('\n'); 
      topOfLine = 1; 
     } 
     if(ch == '{'){ 
      ++bcounter; 
     } 
    } 
} 
+0

這裏的相關排序,特別是給出了我評論過的其他答案之一;你會考慮提出一些解釋嗎?我得到你要去的地方,但對OP和未來讀者進行解釋可能會有幫助。 – 2014-12-02 15:20:08

+0

我認爲這很簡單直接的實現。我認爲這不是特別困難的地方。雖然我認爲不適合實際使用。 – BLUEPIXY 2014-12-02 15:24:53

+0

@BLUEPIXY你能向我解釋一下topOfLine變量的用法嗎? – CharisAlex 2014-12-03 11:49:55

0

我已閱讀你的代碼,並且你已經有了基本的編程邏輯問題 我認爲你應該練習編程這樣的算法以提升你的編程技巧和算法思維能力。

我寫了一段代碼,可以爲你做這件事但你必須時刻記住,編程有時是一個非常長的編碼過程,嘗試不同的輸入,然後分析輸出。

而且在某些情況下,調試書面代碼比編碼本身更重要。

下面是代碼:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int ch; 
    ch = getchar(); 
    int prevch=ch; 
    int lbcounter=0; /*Left curly bracket counter*/ 
    int rbcounter=0; /*Right curly bracket counter*/ 
    while (ch != EOF) 
    { 
     if (ch != ';' && ch != '{' && ch!= '}') 
     { 
      if(prevch=='\n') 
      for(int i=lbcounter;i>0;i--) 
      { 
       putchar('\t'); 
      } 
      putchar(ch); 
      prevch=ch; 
    } 
    if (ch == ';') 
    { 
     if (prevch == ';' || prevch == '{' || prevch== '}'||prevch=='\n') 
     for(int i=lbcounter;i>0;i--) 
     { 
      putchar('\t'); 
     } 
     putchar(ch); 
     putchar('\n'); 
     prevch='\n'; 
    } 
    if (ch == '{') 
    { 

     if(lbcounter==0) 
     { 
       putchar('\n'); 
       lbcounter++; 
       putchar(ch); 
       putchar('\n'); 
       prevch='\n'; 
     } 
     else 
     { 

      for(int i=lbcounter ;i>0;i--) 
      { 
       putchar('\t'); 
      } 
      putchar(ch); 
      lbcounter++; 
      putchar('\n'); 
      prevch='\n'; 
     } 

    } 
    if (ch == '}') 
    { 

     lbcounter--; 
     for(int i=lbcounter;i>0;i--) 
     { 
      putchar('\t'); 
     } 
     putchar(ch); 
     putchar('\n'); 
     prevch='\n'; 
    } 

    ch=getchar(); 
} 
} 

而且作爲最後提醒試圖理解的代碼,而不是隻使用它。

第一個if塊的邏輯: 您必須考慮除了';'以外的字符。 ,'}','{'在字符前應該有相同數量的製表符將字符放在由最後的'{'字符創建的塊的同一縮進級別中,並且如果只有前一個字符是'\ n'必須有選項卡,因爲對於像'void'這樣的字符串,您不應該在兩個字符之間放置製表符。

如果該第二邏輯塊: 此如果塊做同樣的事情作爲第一,如果有兩個不同 第一塊:它把一個新行字符之後的「;」字符和 第二:只有當放入的前一個字符是';','}','{','\ n'之一時,纔會放入必需的選項卡,因爲在'void'這樣的字符串中。標籤不應該放在';'之前字符。

第三個if塊的邏輯: 您知道a'{'後面跟着一個具有相同縮進級別的'}'字符,因此您已將最後一個'{'字符的縮進級別保存在'lbcounter',因此您在'}'之前放置相同數量的選項卡,並且在每個'}'之後縮進級別減少一個'labcounter--'。

1

問題是當您插入換行符時,不會保留縮進。你需要的是一個存儲當前選項卡數量的變量。

int tab_qty = 0; // before your while loop 
tab_qty++; // after printing a left bracket 
tab_qty--; // before printing a right bracket 

然後你行的開頭插入\t N次(其中N = tab_qty)。

相關問題