gpt4 book ai didi

c - K & R 练习 : My Code Works, 但感觉很臭;清理建议?

转载 作者:太空狗 更新时间:2023-10-29 17:00:14 24 4
gpt4 key购买 nike

我正在写 K&R 书。我阅读的内容比我做的练习要多,主要是因为时间不够。我正在 catch 进度,并且已经完成了教程第 1 章中几乎所有的练习。

我的问题是练习 1-18。练习是:

Write a program to remove trailing blanks and tabs from line of input, and to delete entirely blank lines

我的代码(如下)做到了这一点,并且有效。我的问题是我实现的 trim 方法。感觉……不对劲……不知何故。就像如果我在代码审查中看到类似的 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 章不做指针。)我“有点”得到了其中一些解决方案,但它们对于我所处的位置来说仍然有点高级......

我正在寻找的大部分内容是 trim 方法本身——特别是我正在循环 3 次(感觉很脏)这一事实。我觉得如果我稍微聪明一点(即使没有 C 的高级知识),这可能会更干净。

最佳答案

如果您坚持阅读第 1 章,那我觉得这很不错。从代码审查的角度来看,这是我的建议:

在 C 中检查相等性时,总是把常量放在第一位

if (1 == myvar)

这样你就永远不会不小心做这样的事情:

if (myvar = 1)

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

关于c - K & R 练习 : My Code Works, 但感觉很臭;清理建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/161873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com