K & R 练习:我的代码可以工作,但感觉很臭;清理建议?

2024-04-10

我正在写《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 的高级知识),这可能会更干净。


如果你坚持阅读第一章,那对我来说看起来相当不错。从代码审查的角度来看,我建议如下:

在 C 中检查相等性时,始终将常量放在前面

if (1 == myvar)

这样你就永远不会意外地做这样的事情:

if (myvar = 1)

在 C# 中你无法摆脱这一点,但它在 C 中编译得很好,而且调试起来真的很麻烦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

K & R 练习:我的代码可以工作,但感觉很臭;清理建议? 的相关文章

随机推荐