K&R section 1.9 保存输入最长行的代码有以下功能:
int getline(char s[], int lim)
{
int c, i;
for(i = 0; i < lim -1 && (c =getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = c;
return i;
}
然而,为了最佳实践,我了解到一个函数只做一件事。我相信此函数将其输入中的行复制到 s 的 char 数组中并返回长度。这不是考虑两件事吗?我认为这是一种不好的做法是否正确?
详细来说,我们确实使用了 getLine 函数的输入,但使用的是一种非常不直观的方式。
main()
{
int len; /*current line length*/
int max; /*Current max line length seen so far*/
char line[MAXLINE]; /*Current input line */
char longest[MAXLINE]; /*Longest line saved here*/
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/*FUNCTION GETLINE TAKEN OUT */
/*copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
最佳答案
不,有两个原因。
第一个可能会争辩说 getline
(顾名思义)的目的是从输入中读取一行。它也返回读取的字符数这一事实可以用 C 字符串的工作方式来解释,否则该函数不能用于读取包含空字节的数据。
第二个函数不包含任何额外的代码来计算长度。它是读取字符串的副产品。否则该函数将是 void
类型,因此返回字符串的长度确实没有任何缺点。
此外,编码指南本身并没有结束,但应该有助于生成好的代码。我看不出如何通过省略 return 语句并编写一个单独的 O(n) 函数来检索长度来改进这段代码。
关于c - 将一行读取到 s 上并返回其长度的函数是好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26555359/