Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中创建一个返回下一行输入的函数_C_Fgets_C Strings_Calloc - Fatal编程技术网

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

如何在C中创建一个返回下一行输入的函数,c,fgets,c-strings,calloc,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_

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

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

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

  • 更好的方法是使用
    静态
    数组

  • 不要使用全局变量。用
    static
    存储持续时间声明
    str

  • 使用
    LINE\u MAX
    ,而不是256个字符-为什么一行只能短于256个字符

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

  • 检查
    malloc()
    是否失败

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

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

  • #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;
    }
    

总之,我要写的函数是这样的:

#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;
}
#包括
#包括
#包括
#包括
char*my_getline_stdin()
{
静态字符buf[LINE_MAX];
if(fgets(buf、sizeof(buf)、stdin)){
char*p=strchr(buf,'\n');
如果(p)
*p=0;
返回buf;
}
返回NULL;
}

谁负责释放
str
?如果线路长度超过256怎么办?如果没有参数,就无法安全地执行此操作。哦,
str
应该是本地的或数组。@H2CO3您对getline-
str==0
的此接口满意吗?这是一个伪装成公共字段的单态对象。@Elazar我不明白你的意思…@H2CO3,但你确实修正了你的答案。