2010-04-08 10 views
13

En una tarea para la universidad se sugirió utilizar la función C readline en un ejercicio. He buscado su referencia pero aún no la he encontrado. ¿Realmente existe? En que encabezado? ¿Puedes publicar el enlace a la referencia?C función readline

Respuesta

15

Readline existe en dos lugares, libreadline y libedit (también llamado libeditline). Ambos tienen una interfaz idéntica. La diferencia es que libreadline tiene licencia bajo la GPL, libedit es 3 cláusula BSD. Licenciar realmente no es una preocupación para una tarea, al menos no creo que lo sea. Cualquiera de las licencias le permite usar el código libremente. Si enlaza con readline, asegúrese de hacer que todo el programa GPL 2 or later satisfaga cualquier versión de la GPL que rija el sistema readline. Puede ser GPL2 + o GPL3 +, según la edad del sistema. No estoy abogando por ninguna licencia, eso depende de usted.

Nota, se encargan de instalar ya sea/o vincular y ajustar según sea necesario (-lreadline o -ledito-leditline). Ambas son bibliotecas y no forman parte de la biblioteca C estándar.

Editar (idea de último momento):

Si la liberación de un programa en el medio natural, es un buen gesto para permitir al usuario configurar con su readline de elección. Por ejemplo: --with-readline o --with-libedit, etc. Esto permite un paquete binario que se ajuste a su elección de licencia, al menos en cuanto a readline.

Enlaces: Readline y Edit/Editline.

+3

lo que significa que quiere 'libedit' porque las reglas BSD. : P – Earlz

+0

Sí, he visto 'libedit' encarnar como' libeditline' en más de unos pocos sistemas, aunque no recuerdo qué eran en este momento. –

+0

También tenga en cuenta que no hice ningún enlace a ninguna licencia. readline puede ser GPL2 o posterior o GPL3 dependiendo de la versión que use, sin embargo, la licencia BSD de 3 cláusulas permanece estática. –

-5

No existe.

Se equivocaron y se refieren a gets() de stdio.h.

También esta es una función muy insegura debido a que no hay un tamaño máximo para leer el parámetro, por lo que es una seguridad inmediata completa (ataque de desbordamiento del búfer de búsqueda). Puede utilizar fgets() en su lugar, como sugieren los enojados comentarios a continuación.

+11

No, ** no ** use 'gets' - ever! –

+0

@Jerry +1 ... ¿Recomiendas usar fgets? – LB40

+3

Para respaldar Jerry up: 'gets' no le permite especificar un límite en el número de caracteres para leer. Esto es malo, porque estás leyendo una matriz de caracteres, que tiene una longitud fija. Si lees un texto que es más largo que la longitud de la matriz, obtienes un desbordamiento del búfer, lo que puede ocasionar que el programa se cuelgue o que se sobrescriba la memoria que no debe tocarse. –

3

No creo que sea una función estándar.

me implementación sencilla sería así:

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; 
    } 
}

Utiliza fgets() para leer hasta MAX_LINE - 1 caracteres en el buffer 'en'. Quita el espacio en blanco anterior y devuelve un puntero al primer carácter que no sea de espacio en blanco.

+5

readline() ofrece un historial de comandos, finalización de pestañas, edición de línea simple, etc. Es una biblioteca externa pero muy popular. –

+1

@Tim: Tiene razón, la biblioteca Readline hace eso, pero creo que solo quiere que una función lea una línea como una matriz C char. – yassin

+3

Creo que quería enlaces a las bibliotecas. –

Cuestiones relacionadas