0

我对 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

4

1 回答 1

2

这行得通,但这里有一些注意事项要记住:

  • 不要强制转换的返回值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;
}
于 2013-06-02T20:33:32.063 回答