编写代码以缩进代码
Writing a Code to Indent Code
我的目标是编写一个缩进 char *input
中给出的 C 代码的 C 程序。一级缩进的样式在字符串 const char *pad
中给出。我写了下面的代码,它在我的脑海中找到了,但在实践中却没有。一定有什么地方出错了,但我找不到。
另外,我不明白为什么 Valgrind 不喜欢包含 while(...) 的行。大小 1 的读取无效...
任何 {
将缩进级别增加一级,任何 }
将缩进级别减少一级。不应用其他缩进规则。我假设字符串文字中没有大括号。
char *indent(char *input, const char *pad)
{
int lenpad = strlen(pad);
int inlen = strlen(input);
char *output = malloc(inlen+lenpad*90); //Here I'm praying +lenpad*90 is enough
int indent = 0;
int i = 0;
int j = 0;
int ndx;
int ondx;
char current = 'a';
int n;
for(ndx=ondx=0; ndx<inlen; ndx++){
current = input[ndx];
if(current == '{') indent++;
if(current == '\n'){
output[ondx++] = '\n';
n = ondx;
while(input[n] != '\n' && input[n] != '[=10=]'){ //Trying to check if the line to come has a curly bracket.
if(input[n] == '}') //If it does, don't indent that line anymore.
indent--;
n++;
}
for(j=0; j<indent; j++){
for(i=0; i<lenpad; i++){
output[ondx++] = pad[i];
}
}
}
else{
output[ondx++] = current;
}
}
free(input);
output[ondx] = '[=10=]';
return output;
}
而不是:
int main(void) {
printf("asdfasdf\n");
while (1)
{
while (2) {
printf("printsomething\n");
}
}
}
我的代码给出:
int main(void) {
printf("asdfasdf\n");
while (1)
{
while (2) {
printf("printsomething\n");
}
}
}
在您尝试编写的代码美化器中,您必须 :
- 吞下(不输出)一行中的所有初始空格(在
\n
之后)
- 将它们替换为根据
{
和 }
的数量计算出的正确缩进
实现它并在这里询问你是否可以让它工作
换行
n = ondx;
至
n = ndx + 1;
您希望 n
成为输入中下一项的索引,而不是输出中的索引。
我的目标是编写一个缩进 char *input
中给出的 C 代码的 C 程序。一级缩进的样式在字符串 const char *pad
中给出。我写了下面的代码,它在我的脑海中找到了,但在实践中却没有。一定有什么地方出错了,但我找不到。
另外,我不明白为什么 Valgrind 不喜欢包含 while(...) 的行。大小 1 的读取无效...
任何 {
将缩进级别增加一级,任何 }
将缩进级别减少一级。不应用其他缩进规则。我假设字符串文字中没有大括号。
char *indent(char *input, const char *pad)
{
int lenpad = strlen(pad);
int inlen = strlen(input);
char *output = malloc(inlen+lenpad*90); //Here I'm praying +lenpad*90 is enough
int indent = 0;
int i = 0;
int j = 0;
int ndx;
int ondx;
char current = 'a';
int n;
for(ndx=ondx=0; ndx<inlen; ndx++){
current = input[ndx];
if(current == '{') indent++;
if(current == '\n'){
output[ondx++] = '\n';
n = ondx;
while(input[n] != '\n' && input[n] != '[=10=]'){ //Trying to check if the line to come has a curly bracket.
if(input[n] == '}') //If it does, don't indent that line anymore.
indent--;
n++;
}
for(j=0; j<indent; j++){
for(i=0; i<lenpad; i++){
output[ondx++] = pad[i];
}
}
}
else{
output[ondx++] = current;
}
}
free(input);
output[ondx] = '[=10=]';
return output;
}
而不是:
int main(void) {
printf("asdfasdf\n");
while (1)
{
while (2) {
printf("printsomething\n");
}
}
}
我的代码给出:
int main(void) {
printf("asdfasdf\n");
while (1)
{
while (2) {
printf("printsomething\n");
}
}
}
在您尝试编写的代码美化器中,您必须 :
- 吞下(不输出)一行中的所有初始空格(在
\n
之后) - 将它们替换为根据
{
和}
的数量计算出的正确缩进
实现它并在这里询问你是否可以让它工作
换行
n = ondx;
至
n = ndx + 1;
您希望 n
成为输入中下一项的索引,而不是输出中的索引。