如何控制标签位置以正确缩进作为输入提供的代码?
我使用括号计数器设置适当的缩进量(例如,如果第一个{
位于第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
。
答案 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;。