控制选项卡位置以在输出中正确缩进

时间:2014-12-01 19:52:31

标签: c indentation

如何控制标签位置以正确缩进作为输入提供的代码?

我使用括号计数器设置适当的缩进量(例如,如果第一个{位于第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

3 个答案:

答案 0 :(得分: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;
        }
    }
}

答案 1 :(得分: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)。

答案 2 :(得分: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块的逻辑: 您必须考虑到除了&#39 ;;&#39;之外的字符。 ,&#39;}&#39; ,&#39; {&#39;在字符之前应该有相同数量的制表符,以便将字符放在由最后一个&#39; {&#39; {&#39; {&#39;}创建的块的同一缩进级别中。字符,如果只有前一个字符是&#39; \ n&#39;必须有标签,因为像“&#39; void&#39;你不应该在两个角色之间插入标签。

第二个if块的逻辑: 这个if块和第一个if块有两个不同之处 首先:它在&#39 ;;&#39;之后添加一个新的字符。性格和 第二种:只有在放置的前一个字符是以下字符之一时才会显示所需的标签&#39;;&#39;,&#39;}&#39;,&#39; {&#39;,& #39; \ n&#39; ,因为在像#&lt; void;&#39;标签不应放在&#39 ;;&#39;之前。字符。

第三个if块的逻辑: 你知道a&#39; {&#39;应该跟着&#39;}&#39;具有相同缩进级别的字符,因此您保存了最后一个缩进级别的缩进级别。{&#39; &#39; lbcounter&#39;中的角色所以你在&#39;}&#39;之前加上相同数量的标签。在每个&#39;}之后缩进级别减少了一个实验室 - &#39;。