我正在写《K&R》一书。我提前阅读的内容比做练习的内容还要多,主要是因为时间不够。我正在赶上,并且已经完成了教程第一章中的几乎所有练习。
我的问题是练习 1-18。练习的目的是:
编写一个程序来删除尾随空白
从输入行中删除制表符,并删除整个空白行
我的代码(如下)做到了这一点,并且有效。我的问题是我实施的修剪方法。不知怎么的,感觉……不对劲。就像如果我在代码审查中看到类似的 C# 代码,我可能会发疯。 (C# 是我的专长之一。)
任何人都可以提供一些关于清理这个问题的建议吗?问题是,所说的建议只能使用 K & R 第 1 章中的知识。(我知道有无数种方法可以使用完整的 C 库来清理这个问题;我们'这里只是谈论第 1 章和基本的 stdio.h。)另外,在提供建议时,你能解释一下为什么它会有所帮助吗? (毕竟,我正在努力学习!还有谁比这里的专家更适合学习呢?)
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[], int max);
void trim(char line[], char ret[]);
int main()
{
char line[MAXLINE];
char out[MAXLINE];
int length;
while ((length = getline(line, MAXLINE)) > 0)
{
trim(line, out);
printf("%s", out);
}
return 0;
}
int getline(char line[], int max)
{
int c, i;
for (i = 0; i < max - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
line[i] = c;
if (c == '\n')
{
line[i] = c;
++i;
}
line[i] = '\0';
return i;
}
void trim(char line[], char ret[])
{
int i = 0;
while ((ret[i] = line[i]) != '\0')
++i;
if (i == 1)
{
// Special case to remove entirely blank line
ret[0] = '\0';
return;
}
for ( ; i >= 0; --i)
{
if (ret[i] == ' ' || ret[i] == '\t')
ret[i] = '\0';
else if (ret[i] != '\0' && ret[i] != '\r' && ret[i] != '\n')
break;
}
for (i = 0; i < MAXLINE; ++i)
{
if (ret[i] == '\n')
{
break;
}
else if (ret[i] == '\0')
{
ret[i] = '\n';
ret[i + 1] = '\0';
break;
}
}
}
编辑:我很感谢我在这里看到的所有有用的提示。我想提醒大家,我在 C 方面仍然是个菜鸟,特别是还没有达到指导的水平。 (记住 K&R 第 1 章的内容——第 1 章不做指针。)我“有点”得到了其中一些解决方案,但它们仍然比我所处的位置先进......
我正在寻找的大部分内容是修剪方法本身 - 特别是我正在循环的事实3次(感觉很脏)。我觉得如果我再聪明一点(即使没有 C 的高级知识),这可能会更干净。