13

在大学作业中,有人建议readline在练习中使用 C 函数。我已经搜索了它的参考,但仍然没有找到它。它真的存在吗?在哪个标题?你能把参考的链接贴出来吗?

4

5 回答 5

15

Readline 存在于两个地方,libreadlinelibedit(也称为libeditline)。两者都有相同的界面。不同之处在于 libreadline 是在 GPL 下获得许可的,libedit 是 3 条款 BSD。许可真的不是任务的问题,至少我不这么认为。任一许可证都允许您自由使用代码。如果您链接到 readline,请务必使整个程序GPL 2 or later满足管理系统的任何 GPL 版本readline。它可能是 GPL2+ 或 GPL3+,具体取决于系统的年龄。我不提倡任何一种许可证,这取决于你。

请注意,请注意安装/或并根据需要调整链接(-lreadline -ledit -leditline)。两者都是库,而不是标准 C 库的一部分。

编辑(事后考虑):

如果将程序发布到野外,这是一个很好的姿态,允许用户根据自己readline的选择对其进行配置。例如:--with-readlineor--with-libedit等​​。这允许二进制包符合他们选择的许可证,至少就其readline而言。

链接:ReadlineEdit/Editline

于 2010-04-08T14:15:19.197 回答
3

我认为这不是标准功能。

我简单的实现是这样的:

char *Readline(char *in) {
   字符 *cptr;

   if (cptr = fgets(in, MAX_LINE, stdin)) {
     /* 杀死前面的空格但留下 \n 所以我们保证有一些东西
     而(*cptr == ' ' || *cptr == '\t') {
       cptr++;
     }
     返回cptr;    
    } 别的 {
     返回0;
   }
 }

它使用 fgets() 将最多 MAX_LINE - 1 个字符读入缓冲区“in”。它去除前面的空白并返回指向第一个非空白字符的指针。

于 2010-04-08T14:15:10.990 回答
0

如果你需要一个“readLine()”函数,比如 Java-BufferedReader 中的 readLine(),你也可以在“line.h”中自由使用我的函数 «char* get_line(FILE *filePointer)»,我只是为了这个目的:https ://github.com/pheek/line.h/blob/master/line.h

于 2018-11-29T06:05:08.697 回答
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);
   }
于 2019-11-14T19:00:24.777 回答
-6

它不存在。

他们弄错了,从 stdio.h 引用了 gets()。

这也是一个非常不安全的功能,因为没有读取参数的最大大小,使其立即成为安全整体(查找缓冲区溢出攻击)。您可以改用 fgets() 。

于 2010-04-08T14:12:46.207 回答