我对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
分配的内容?
答案 0 :(得分:2)
这是有效的,但这里有一些要记住的注意事项:
您甚至不需要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;
}