C、C++代码格式优化软件---献给编程爱好者
当题目不会做或者算法实现不了时,我们很自然地去网上搜代码,但是网上的代码排版太乱,根本不遵循代码规范,举个例子:大家可以点击这个链接http://tieba.baidu.com/f?kz=825544513,,这里有个代码,
#include<iostream>
#include<string.h>
using namespace std;
int main()
{ char a[100],b[1000];
int k,i,j,t=0,la,lb;
scanf("%d",&k);
while(t<k)
{
scanf("%s",a);
scanf("%s",b);
printf("Case %d:\n",++t);
printf("%s + %s = ",a,b);
la=strlen(a);
lb=strlen(b);
char c[1000];
if(la<lb)
{ strcpy(c,a); strcpy(a,b); strcpy(b,c);
int c=la; la=lb; lb=c;
}
for(i=0;i<la/2;++i)
{ int c=a[i]-48;
a[i]=a[la-i-1]-48;
a[la-i-1]=c;
}
if(la&1) a[la/2]-=48;
for(j=0;j<lb/2;++j)
{ int c=b[j]-48;
b[j]=b[lb-j-1]-48;
b[lb-j-1]=c;
}
if(lb&1) b[lb/2]-=48;
bool flag=0;
for(i=lb;i<=la;++i)
b[i]=0;
for(i=0;i<la;++i)
{
c[i]=a[i]+b[i]+flag;
flag=c[i]/10; c[i]=c[i]%10;
}
if(flag) cout<<1;
for(i=la-1;i>=0;--i)
printf("%d",c[i]);
cout<<endl;
if(t!=k)
cout<<endl;
}
return 0;
}
怎么样??这种代码一看就心烦,一点格式都没有,他提问都一年多了,,都没人回答,估计就是这个原因。
但是,如果这是我们需要的代码怎么办??一点一点地补齐空格,相当麻烦,如果代码再长点呢,几百上千行,估计没人会有耐心再看这个代码
这就是问题的由来。为了解决这个问题,我专门写了这个软件,如果仅仅是缩进,这个简单,我想,,既然写了,就把它完善到最好。以后我们进了软件公司,估计首先得到的就是一份代码规范(关于代码规范,大家可以到这个网站看一下http://wenku.baidu.com/view/f6a3341dfc4ffe473368abce.html)代码规范很重要,因为在公司里,大部分时间是用来看别人的代码,如果写成一堆乱麻,公司怎么会要你??有一个不规范的地方扣100元钱,估计工资都扣没了。有些人写代码写了好几年了,习惯不能一下子改过来,怎么办?为了规范再去检查代码吗?哈哈,我的软件就派上用场了,你只要用我的软件一优化,立马丑小鸭变天鹅,一个规范的代码就出来了,哈哈,就是这么有用!先看看上面的代码被我的软件优化后的效果
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char a[100], b[1000];
int k, i, j, t = 0, la, lb;
scanf("%d", &k);
while(t < k)
{
scanf("%s", a);
scanf("%s", b);
printf("Case %d:\n", ++t);
printf("%s + %s = ", a, b);
la = strlen(a);
lb = strlen(b);
char c[1000];
if(la < lb)
{
strcpy(c, a); strcpy(a, b); strcpy(b, c);
int c = la; la = lb; lb = c;
}
for(i = 0; i < la/2; ++i)
{
int c = a[i]-48;
a[i] = a[la-i-1]-48;
a[la-i-1] = c;
}
if(la&1) a[la/2] -= 48;
for(j = 0; j < lb/2; ++j)
{
int c = b[j]-48;
b[j] = b[lb-j-1]-48;
b[lb-j-1] = c;
}
if(lb&1) b[lb/2] -= 48;
bool flag = 0;
for(i = lb; i <= la; ++i)
b[i] = 0;
for(i = 0; i < la; ++i)
{
c[i] = a[i] + b[i] + flag;
flag = c[i]/10; c[i] = c[i]%10;
}
if(flag) cout << 1;
for(i = la-1; i >= 0; --i)
printf("%d", c[i]);
cout << endl;
if(t != k)
cout << endl;
}
return 0;
}
怎么样??还不错吧。说明一下,我的软件不仅仅是在行首补上空格,更重要的是对行里面的代码格式也进行了优化,这是一些ide所不能比的,完全是参考代码格式标准进行优化的,例如“<=”“=”“==”“>=”“<<”“>>”“+”“-”“*”“/”“%”“!=”等符号左右都补全空格,“[]”“()”等里面都消除空格,{}严格对齐,“”引号里面的内容不做修改,保证输出格式正确,还有把代码中的空行删除……更多细节大家可以研究一下代码,下面把我的的劳动成果无偿献给大家
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /*************************************************************************
2 > File Name: 代码格式优化软件.cpp
3 > Author: ma6174
4 > Mail: ma6174@163.com
5 > Created Time: 2011年11月18日 星期五 16时37分09秒
6 ************************************************************************/
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 void welcome()
11 {
12 printf("\t\t\t C、C++ 代码格式优化软件\n");
13 printf("\t\t\t\tBY ma6174\n");
14 printf("\t\t\t ma6174@163.com");
15 printf("\n使用方法:\n\n");
16 printf("先将你要优化的代码复制到这里,\n\n按一下回车键,然后按“Ctrl + Z”组合键,再按一下回车,你就能看到漂亮的代码啦\n");
17 for(int i = 0; i < 80; i++)
18 printf("=");
19 printf("\n\n");
20 }
21 int main()
22 {
23 welcome();
24 char a[1000];
25 int i, len, tab = 0, j, flag = 0, tag = 0; //flag标记是否是注释
26 FILE *fp;
27 fp = fopen("temp.txt", "w");
28 if(fp == NULL)
29 {
30 printf("文件打开失败");
31 exit(1);
32 }
33 while(gets(a))
34 {
35 j = 0;
36 len = strlen(a);
37 while(j < len && (a[j] == ' ' || a[j] == '\t'))
38 j++;
39 if(j >= len)
40 continue;
41 i = 0;
42 //消除行首所有空格和制符表
43 while(a[i] == ' ' || a[i] == '\t')
44 i++;
45 //行首为#
46 if(a[i] == '#')
47 {
48 while(a[i] == ' ' || a[i] == '\t')
49 i++;
50 for(; i < len; i++)
51 {
52 //文件包含补空格
53 if((a[i] == '<' || a[i] == '"') && a[i-1] != ' ')
54 fprintf(fp, " ");
55 fprintf(fp, "%c", a[i]);
56 }
57 fprintf(fp, "\n");
58 continue;
59 }
60 //行首补全空格
61 if(a[i] == '}' && !flag)
62 tab--;
63 for(j = 1; j <= 4*tab; j++)
64 fprintf(fp, " ");
65 //第一个字母既是}则直接输出
66 if(a[i] == '}')
67 {
68 fprintf(fp, "}");
69 i++;
70 }
71 if(a[i] == '{' && a[i-1] != '\'' && a[i + 1] != '\'' && a[i-1] != '"' && a[i + 1] != '"')
72 {
73 fprintf(fp, "{");
74 int j = i + 1;
75 while(j < len && (a[j] == ' ' || a[j] == '\t'))
76 j++;
77 tab++;
78 if(j >= len)
79 {
80 fprintf(fp, "\n");
81 i = j;
82 continue;
83 }
84 fprintf(fp, "\n");
85 i = j;
86 for(int k = 1; k <= 4*tab; k++)
87 fprintf(fp, " ");
88 }
89 int k = i;
90 //处理后续元素
91 for(; i < len; i++)
92 {
93 //删除程序中的多余空格,只保留一个
94 while(a[i] == ' ' && a[i + 1] == ' ' || a[i] == '\t' && a[i + 1] == '\t')
95 {
96 i++;
97 }
98 //出现注释,,直接原样输出
99 if(flag)
100 {
101 while(i < len)
102 {
103 if(a[i] == '*' && a[i + 1] == '/')
104 flag = 0;
105 fprintf(fp, "%c", a[i]);
106 i++;
107 }
108 continue;
109 }
110 //标记注释flag
111 if(a[i] == '/' && a[i + 1] == '*')
112 {
113 flag = 1;
114 while(i < len)
115 {
116 if(a[i] == '*' && a[i + 1] == '/')
117 flag = 0;
118 fprintf(fp, "%c", a[i]);
119 i++;
120 }
121 continue;
122 }
123 //双斜线注释直接原样输出
124 if(a[i] == '/' && a[i + 1] == '/')
125 {
126 while(i < len)
127 {
128 fprintf(fp, "%c", a[i]);
129 i++;
130 }
131 continue;
132 }
133 //处理“”内的内容
134 if(a[i] == '"' && a[i-1] != '\'' && a[i + 1] != '\'')
135 {
136 while(a[i + 1] != '"')
137 {
138 fprintf(fp, "%c", a[i]);
139 i++;
140 }
141 fprintf(fp, "%c%c", a[i], a[i + 1]);
142 i++;
143 continue;
144 }
145 //处理 '
146 if(a[i] == '\'' && a[i + 2] == '\'')
147 {
148 fprintf(fp, "%c%c%c", a[i], a[i + 1], a[i + 2]);
149 i += 2;
150 continue;
151 }
152 // "{" 换行,若在引号内则不换行
153 if(a[i] == '{' && a[i-1] != '\'' && a[i + 1] != '\'' && a[i-1] != '"' && a[i + 1] != '"')
154 {
155 if(i != k)
156 {
157 fprintf(fp, "\n");
158 tag = 1;
159 }
160 if(tag == 0)
161 for(j = 1; j <= 4*(tab-1);j++)
162 fprintf(fp, " ");
163 else
164 if(tag == 1)
165 for(j = 1; j <= 4*tab; j++)
166 fprintf(fp, " ");
167 fprintf(fp, "{");
168 j = i + 1;
169 while(j < len && (a[j] == ' ' || a[j] == '\t'))
170 j++;
171 if(j >= len)
172 {
173 for(j = 1; j <= 4*(tab + 1);j++)
174 fprintf(fp, " ");
175 while(a[i + 1] == ' ')
176 i++;
177 }
178 else
179 {
180 fprintf(fp, "\n");
181 for(j = 1; j <= 4*(tab + 1);j++)
182 fprintf(fp, " ");
183 }
184 tab++;
185 continue;
186 }
187 //处理'}'
188 if(a[i] == '}' && a[i + 1] == '}')
189 {
190 fprintf(fp, "}\n");
191 tab--;
192 for(j = 1; j <= 4*(tab-1);j++)
193 fprintf(fp, " ");
194 fprintf(fp, "}");
195 tab--;
196 i++;
197 continue;
198 }
199 if(a[i] == '}' && a[i-1] != '\'' && a[i + 1] != '\'' && a[i-1] != '"' && a[i + 1] != '"')
200 {
201 j = i + 1;
202 while(j < len && (a[j] == ' ' || a[j] == '\t'))
203 j++;
204 if(j >= len)
205 {
206 if(k != i)
207 fprintf(fp, "\n");
208 for(j = 1; j <= 4*(tab-1);j++)
209 fprintf(fp, " ");
210 }
211 fprintf(fp, "}");
212 tab--;
213 continue;
214 }
215 //以下处理其他字符
216 if((a[i] == ')' || a[i] == ',' || a[i] == ';') && ((a[i + 1] == ')' || a[i + 1] == ';')))
217 {
218 fprintf(fp, "%c%c", a[i], a[i + 1]);
219 i++;
220 continue;
221 }
222 if(a[i] == ')' || a[i] == ',' || a[i] == ';')
223 {
224 fprintf(fp, "%c", a[i]);
225 if(i != len-1 && a[i + 1] != ' ')
226 fprintf(fp, " ");
227 continue;
228 }
229 if(a[i] == '-' && a[i + 1] == '-' || a[i] == '+' && a[i + 1] == '+')
230 {
231 fprintf(fp, "%c%c", a[i], a[++i]);
232 continue;
233 }
234 if(a[i] == '=' && a[i + 1] == '=' || a[i] == '&' && a[i + 1] == '&' || a[i] == '|' && a[i + 1] == '|' || a[i] == '!' && a[i + 1] == '=')
235 {
236 if(a[i-1] != ' ')
237 fprintf(fp, " ");
238 fprintf(fp, "%c%c", a[i], a[i + 1]);
239 if(a[i + 2] != ' ')
240 fprintf(fp, " ");
241 i++;
242 continue;
243 }
244 if(a[i] == '!' || a[i] == '~' || a[i] == '&')
245 {
246 fprintf(fp, "%c", a[i]);
247 while(a[i + 1] == ' ')
248 i++;
249 continue;
250 }
251 if(a[i] == ' ' && (a[i + 1] == '[' || a[i + 1] == '.'))
252 {
253 i++;
254 fprintf(fp, "%c", a[i]);
255 continue;
256 }
257 if(a[i] == '-' && a[i + 1] == '>')
258 {
259 if(a[i-1] != ' ')
260 fprintf(fp, " ");
261 fprintf(fp, "%c%c", a[i], a[i + 1]);
262 if(a[i + 2] != ' ')
263 fprintf(fp, " ");
264 i++;
265 continue;
266 }
267 if((a[i] == '%' || a[i] == '-' || a[i] == '+' || a[i] == '*' || a[i] == '\\' || a[i] == '>' || a[i] == '<') && a[i + 1] == '=')
268 {
269 if(a[i-1] != ' ')
270 fprintf(fp, " ");
271 fprintf(fp, "%c%c", a[i], a[i + 1]);
272 if(a[i + 2] != ' ')
273 fprintf(fp, " ");
274 i++;
275 continue;
276 }
277 if(a[i] == '>' && a[i + 1] == '>' || a[i] == '<' && a[i + 1] == '<')
278 {
279 if(a[i-1] != ' ')
280 fprintf(fp, " ");
281 fprintf(fp, "%c%c", a[i], a[i + 1]);
282 if(a[i + 2] != ' ')
283 fprintf(fp, " ");
284 i++;
285 continue;
286 }
287 if((a[i] == '=' || a[i] == '+' || a[i] == '^' || a[i] == '<' || a[i] == '>') && a[i-1] != '\'' && a[i + 1] != '\'' && a[i-1] != '"' && a[i + 1] != '"')
288 {
289 if(a[i-1] != ' ')
290 fprintf(fp, " ");
291 fprintf(fp, "%c", a[i]);
292 if(a[i + 1] != ' ')
293 fprintf(fp, " ");
294 continue;
295 }
296 fprintf(fp, "%c", a[i]);
297 }
298 fprintf(fp, "\n");
299 }
300 fclose(fp);
301 system("start temp.txt");
302 return 0;
303 }
可能有些地方考虑不完善,请大家批评指出。
生成的可执行文件大家可以到我的网盘下载:http://ma6174.ys168.com/
博主ma6174对本博客文章(除转载的)享有版权,未经许可不得用于商业用途。转载请注明出处http://www.cnblogs.com/ma6174/
对文章有啥看法或建议,可以评论或发电子邮件到ma6174@163.com