如何创建一个函数来返回C中的下一行输入

时间:2013-06-02 20:22:55

标签: c fgets c-strings calloc

我对C很新,所以作为我学习的一部分,我想创建一个函数,只返回一个字符串,这是输入中的下一行,不需要任何参数。

这是我到目前为止所做的:

#define BUFFER 256
char *str;
char *getline()
{
    if (str == 0)
        str = (char*)calloc(BUFFER, sizeof(char));
    if (fgets(str, BUFFER, stdin) != 0)
    {
        size_t len = strlen(str);
        if (len > 0 && str[len-1] == '\n')
            str[len-1] = '\0';
        return str;
    }
    return 0;
}

现在,这是做这种事情的最好方法吗?有没有更好的方法可以解决问题? 如果这是最好的方式,我应该在哪里释放我用calloc分配的内容?

1 个答案:

答案 0 :(得分:2)

这是有效的,但这里有一些要记住的注意事项:

  • Don't cast the return value of malloc()

  • 您甚至不需要calloc() - fgets() NUL - 终止该字符串。

  • 更好的是,使用static数组。

  • 不要使用全局变量。请改为str static存储持续时间。

  • 而不是256,使用LINE_MAX - 为什么一行只能短于256个字符?

  • getline()是POSIX C库中函数的名称。重命名您的函数以避免名称冲突。

  • 检查malloc()是否失败!

  • 如果您使用动态内存管理方法,请在阅读完最后一行后忘记free()函数的返回值。

  • 可以简化对换行符结尾的检查:


char *p = strchr(str, '\n');
if (p)
    *p = 0;

总而言之,我要写的功能是这样的:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>

char *my_getline_stdin()
{
    static char buf[LINE_MAX];

    if (fgets(buf, sizeof(buf), stdin)) {
        char *p = strchr(buf, '\n');
        if (p)
            *p = 0;

        return buf;
    }

    return NULL;
}