C readline函数

时间:2010-04-08 14:09:11

标签: c readline

在大学作业中,建议在练习中使用C readline功能。我搜索了它的参考但仍未找到它。它真的存在吗?在哪个标题?您能否发布参考链接?

5 个答案:

答案 0 :(得分:15)

Readline存在于两个地方,libreadlinelibedit(也称为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而言。

链接:ReadlineEdit/Editline

答案 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()代替,如下面的愤怒评论所示。