在大学作业中,有人建议readline
在练习中使用 C 函数。我已经搜索了它的参考,但仍然没有找到它。它真的存在吗?在哪个标题?你能把参考的链接贴出来吗?
5 回答
Readline 存在于两个地方,libreadline
和libedit
(也称为libeditline
)。两者都有相同的界面。不同之处在于 libreadline 是在 GPL 下获得许可的,libedit 是 3 条款 BSD。许可真的不是任务的问题,至少我不这么认为。任一许可证都允许您自由使用代码。如果您链接到 readline,请务必使整个程序GPL 2 or later
满足管理系统的任何 GPL 版本readline
。它可能是 GPL2+ 或 GPL3+,具体取决于系统的年龄。我不提倡任何一种许可证,这取决于你。
请注意,请注意安装/或并根据需要调整链接(-lreadline
或 -ledit
或 -leditline
)。两者都是库,而不是标准 C 库的一部分。
编辑(事后考虑):
如果将程序发布到野外,这是一个很好的姿态,允许用户根据自己readline
的选择对其进行配置。例如:--with-readline
or--with-libedit
等。这允许二进制包符合他们选择的许可证,至少就其readline
而言。
我认为这不是标准功能。
我简单的实现是这样的:
char *Readline(char *in) { 字符 *cptr; if (cptr = fgets(in, MAX_LINE, stdin)) { /* 杀死前面的空格但留下 \n 所以我们保证有一些东西 而(*cptr == ' ' || *cptr == '\t') { cptr++; } 返回cptr; } 别的 { 返回0; } }
它使用 fgets() 将最多 MAX_LINE - 1 个字符读入缓冲区“in”。它去除前面的空白并返回指向第一个非空白字符的指针。
如果你需要一个“readLine()”函数,比如 Java-BufferedReader 中的 readLine(),你也可以在“line.h”中自由使用我的函数 «char* get_line(FILE *filePointer)»,我只是为了这个目的:https ://github.com/pheek/line.h/blob/master/line.h
不确定您是否尝试从 GNU C 库中阅读此内容:ssize_t getline (char **lineptr, size_t *n, FILE *stream)
. 此函数从文件中读取一行,如果需要,甚至可以重新分配更多空间。
在 getline 的联机帮助页中可以找到这方面的一个示例。下面是它的副本。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
FILE *stream;
char *line = NULL;
size_t len = 0;
ssize_t nread;
if (argc != 2) {
fprintf(stderr, "Usage: %s <file>\n", argv[0]);
exit(EXIT_FAILURE);
}
stream = fopen(argv[1], "r");
if (stream == NULL) {
perror("fopen");
exit(EXIT_FAILURE);
}
while ((nread = getline(&line, &len, stream)) != -1) {
printf("Retrieved line of length %zu:\n", nread);
fwrite(line, nread, 1, stdout);
}
free(line);
fclose(stream);
exit(EXIT_SUCCESS);
}
它不存在。
他们弄错了,从 stdio.h 引用了 gets()。
这也是一个非常不安全的功能,因为没有读取参数的最大大小,使其立即成为安全整体(查找缓冲区溢出攻击)。您可以改用 fgets() 。