c - 将一行读取到 s 上并返回其长度的函数是好习惯吗?

标签 c function

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/

相关文章:

c++ - 创建 C++ 共享库时,是否只需要附加库所依赖的 header ?

c++ - 定期调用的 c++ 函数

function - Zend Framework 一个通用文件,用于放置可从 View 访问的函数

c++ - Eclipse- C/C++ <终止,退出值 : -1073741515>

c++ - 为什么当你没有定义一个函数时你会得到一个链接器错误而不是编译器?

c - C 中的动态大小字符串

c++ - 有关C++中函数的默认返回类型的查询

c - 使用 scanf 读取 uint8_t 数据

javascript - 在 JavaScript 中调用函数时正确指定参数值

javascript - Greensock GPSSAP JavaScript在Codepen中抛出错误和演示