我正在写 K&R 的书。我比我做的练习读得更远,主要是因为没有时间。我正在赶上进度,并且已经完成了第 1 章(即教程)中的几乎所有练习。
我的问题是练习 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 的 n00b,特别是还没有得到指针。(记住关于 K&R 的 Ch.1 的一点——Ch.1 不做指针。)我“有点”得到了一些解决方案,但对于我所处的位置,它们仍然有点先进......
我正在寻找的大部分内容是修剪方法本身——特别是我循环了3次的事实(感觉很脏)。我觉得如果我稍微聪明一点(即使没有 C 的高级知识),这本可以更干净。