在大学作业中,建议在练习中使用C readline
功能。我搜索了它的参考但仍未找到它。它真的存在吗?在哪个标题?您能否发布参考链接?
答案 0 :(得分:15)
Readline存在于两个地方,libreadline
和libedit
(也称为libeditline
)。两者都有相同的界面。不同的是libreadline是根据GPL许可的,libedit是BSD的3条款。许可证实际上不是任务的关注点,至少我认为不是。许可证允许您自由使用代码。如果你链接到readline,请务必使整个程序GPL 2 or later
满足任何版本的GPL管理系统readline
。它可能是GPL2 +或GPL3 +,具体取决于系统的使用年限。我不是在提倡许可证,这取决于你。
注意,请注意安装/或根据需要调整链接(-lreadline
或 -ledit
或 -leditline
) 。两者都是库,而不是标准C库的一部分。
编辑(事后补充):
如果将程序发布到野外,它是一个很好的姿势,允许用户使用他们的readline
选项进行配置。例如:--with-readline
或--with-libedit
等。这允许二进制包符合他们的许可选择,至少就readline
而言。
答案 1 :(得分:3)
我认为这不是标准功能。
我简单的实现就像这样:
char *Readline(char *in) { char *cptr; if (cptr = fgets(in, MAX_LINE, stdin)) { /* kill preceding whitespace but leave \n so we're guaranteed to have something while(*cptr == ' ' || *cptr == '\t') { cptr++; } return cptr; } else { return 0; } }
它使用fgets()读取MAX_LINE - 1个字符到缓冲区'in'。它剥离前面的空格并返回指向第一个非空白字符的指针。
答案 2 :(得分:0)
如果您需要“ readLine()”函数,例如Java-BufferedReader中的readLine(),则还可以在“ line.h”中自由使用我的函数«char * get_line(FILE * filePointer)»,为此而编写的:https://github.com/pheek/line.h/blob/master/line.h
答案 3 :(得分:0)
不确定是否尝试从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);
}
答案 4 :(得分:-5)
它不存在。
他们错了,并从stdio.h引用了gets()。
这也是一个非常不安全的功能,因为没有最大的读取参数大小,使其立即安全(查找缓冲区溢出攻击)。您可以使用fgets()代替,如下面的愤怒评论所示。