C readline-Funktion

Lesezeit: 6 Minuten

Benutzeravatar von nunos
nunos

In einer Aufgabe für das College wurde vorgeschlagen, das C zu verwenden readline Funktion in einer Übung. Ich habe nach seiner Referenz gesucht, aber immer noch nicht gefunden. Existiert es wirklich? In welcher Überschrift? Kannst du bitte den Link zur Referenz posten?

Benutzeravatar von Tim Post
Tim Post

Readline existiert an zwei Stellen, libreadline und libedit (auch genannt libeditline). Beide haben eine identische Schnittstelle. Der Unterschied besteht darin, dass libreadline unter der GPL lizenziert ist, libedit ist 3-Klausel-BSD. Die Lizenzierung ist wirklich kein Problem für einen Auftrag, zumindest glaube ich nicht, dass es das ist. Mit beiden Lizenzen können Sie den Code frei verwenden. Wenn Sie gegen readline verlinken, stellen Sie sicher, dass Sie das gesamte Programm erstellen GPL 2 or later die jede Version der GPL erfüllt, die das System regelt readline. Je nach Alter des Systems kann es GPL2+ oder GPL3+ sein. Ich befürworte keine der beiden Lizenzen, das liegt bei Ihnen.

Beachten Sie, dass Sie entweder / oder installieren und die Verknüpfung nach Bedarf anpassen (-lreadline oder -ledit oder -leditline). Beide sind Bibliotheken und nicht Teil der Standard-C-Bibliothek.

Bearbeiten (nachträglich):

Wenn Sie ein Programm freigeben, ist es eine nette Geste, dem Benutzer zu ermöglichen, es mit seinen eigenen zu konfigurieren readline nach Wahl. Zum Beispiel: --with-readline oder --with-libeditusw. Dies ermöglicht ein Binärpaket, das ihrer Lizenzwahl entspricht, zumindest soweit readline ist besorgt.

Verbindungen: Zeile lesen und Bearbeiten/Editline.

  • Ja, ich habe gesehen libedit inkarniert als libeditline auf mehr als ein paar Systemen, obwohl ich mich im Moment nicht erinnern kann, welche das waren.

    – Tim Post

    8. April 2010 um 14:43 Uhr


  • Beachten Sie auch, dass ich keine der beiden Lizenzen verlinkt habe. readline kann GPL2 oder höher oder GPL3 sein, je nach verwendeter Version, jedoch bleibt die 3-Klausel-BSD-Lizenz statisch.

    – Tim Post

    8. April 2010 um 14:55 Uhr

Ich glaube nicht, dass es eine Standardfunktion ist.

Meine einfache Implementierung wäre wie folgt:

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

Es verwendet fgets(), um bis zu MAX_LINE – 1 Zeichen in den Puffer ‘in’ einzulesen. Es entfernt vorangehende Leerzeichen und gibt einen Zeiger auf das erste Nicht-Leerzeichen zurück.

  • readline() bietet einen Befehlsverlauf, Tab-Vervollständigung, einfache Zeilenbearbeitung usw. Es ist eine externe, aber sehr beliebte Bibliothek.

    – Tim Post

    8. April 2010 um 14:38 Uhr

  • @Tim: Du hast Recht, die Readline-Bibliothek macht das, aber ich denke, er will nur, dass eine Funktion eine Zeile als C-Char-Array liest.

    – Jassin

    8. April 2010 um 14:57 Uhr

  • Ich glaube, er wollte Links zu den Bibliotheken.

    – Tim Post

    8. April 2010 um 15:11 Uhr

  • Vielleicht meinte er getline?

    – Craig Ringer

    30. März 2016 um 4:36 Uhr

Benutzeravatar von Ajay Sharma
Ajai Sharma

Nicht sicher, ob Sie versucht haben, dies aus der GNU C-Bibliothek zu lesen: ssize_t getline (char **lineptr, size_t *n, FILE *stream). Diese Funktion liest eine Zeile aus einer Datei und kann bei Bedarf sogar mehr Speicherplatz neu zuweisen.

Ein Beispiel dafür findet sich in der Manpage von getline. Unten ist eine Kopie davon.

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

  • Bitte fügen Sie keinen Link der gesamten Dokumentation bei, sondern verknüpfen Sie verwandte Teile und versuchen Sie, eine detailliertere Antwort zu geben.

    – kesse

    14. November 2019 um 19:52 Uhr

  • Links sind zwar eine großartige Möglichkeit, Wissen zu teilen, aber sie werden die Frage nicht wirklich beantworten, ob sie in Zukunft kaputt gehen. Fügen Sie Ihrer Antwort den wesentlichen Inhalt des Links hinzu, der die Frage beantwortet. Falls der Inhalt zu komplex oder zu umfangreich ist, um hierher zu passen, beschreiben Sie die allgemeine Idee der vorgeschlagenen Lösung. Denken Sie daran, immer einen Link auf die Website der ursprünglichen Lösung zu führen. Siehe: Wie schreibe ich eine gute Antwort?

    – Andreas

    14. November 2019 um 22:15 Uhr

Wenn Sie eine “readLine()”-Funktion benötigen, wie die readLine() in Java-BufferedReader, können Sie auch meine Funktion «char* get_line(FILE *filePointer)» in “line.h” verwenden, für die ich nur geschrieben habe dieser Zweck: https://github.com/pheek/line.h/blob/master/line.h

Benutzeravatar von Pavel Radzivilovsky
Pavel Radzivilovsky

Es existiert nicht.

Sie irrten sich und verwiesen auf gets() von stdio.h.

Auch dies ist eine sehr unsichere Funktion, da es keine maximale Größe zum Lesen von Parametern gibt, wodurch die Sicherheit vollständig wird (Lookup-Pufferüberlaufangriff). Sie können stattdessen fgets() verwenden.

  • Nein, nicht verwenden gets — je!

    – Jerry Sarg

    8. April 2010 um 14:14 Uhr

  • @ Jerry +1 … empfehlen Sie die Verwendung von fgets ?

    – LB40

    8. April 2010 um 14:16 Uhr

  • Um Jerry zu unterstützen: gets lässt Sie kein Limit für die Anzahl der zu lesenden Zeichen angeben. Das ist schlecht, weil Sie in ein Zeichenarray einlesen, das eine feste Länge hat. Wenn Sie Text lesen, der länger als die Länge des Arrays ist, erhalten Sie einen Pufferüberlauf, der dazu führen kann, dass Ihr Programm abstürzt oder Speicher, der nicht berührt werden soll, überschrieben wird.

    – Samir Talwar

    8. April 2010 um 14:20 Uhr

  • Ja, fgets ist in Ordnung, wenn auch ein bisschen Schmerz. Normalerweise lässt es das ‘\n’ am Ende der Zeichenfolge. Eine einfache (wenn auch seltsame) Möglichkeit, das abzustreifen, ist strtok(string, "\n");.

    – Jerry Sarg

    8. April 2010 um 14:22 Uhr

  • Es ganz entschieden tut existieren, tatsächlich sind zwei Bibliotheken verfügbar, die dieselbe API unter verschiedenen Lizenzen anbieten, um sie zu implementieren. Es bietet nette Dinge wie Befehlszeilenbearbeitung, Tab-Vervollständigung, Verlauf usw., die für jede CLI unerlässlich sind.

    – Tim Post

    8. April 2010 um 14:28 Uhr

  • Nein, nicht verwenden gets — je!

    – Jerry Sarg

    8. April 2010 um 14:14 Uhr

  • @ Jerry +1 … empfehlen Sie die Verwendung von fgets ?

    – LB40

    8. April 2010 um 14:16 Uhr

  • Um Jerry zu unterstützen: gets lässt Sie kein Limit für die Anzahl der zu lesenden Zeichen angeben. Das ist schlecht, weil Sie in ein Zeichenarray einlesen, das eine feste Länge hat. Wenn Sie Text lesen, der länger als die Länge des Arrays ist, erhalten Sie einen Pufferüberlauf, der dazu führen kann, dass Ihr Programm abstürzt oder Speicher, der nicht berührt werden soll, überschrieben wird.

    – Samir Talwar

    8. April 2010 um 14:20 Uhr

  • Ja, fgets ist in Ordnung, wenn auch ein bisschen Schmerz. Normalerweise lässt es das ‘\n’ am Ende der Zeichenfolge. Eine einfache (wenn auch seltsame) Möglichkeit, das abzustreifen, ist strtok(string, "\n");.

    – Jerry Sarg

    8. April 2010 um 14:22 Uhr

  • Es ganz entschieden tut existieren, tatsächlich sind zwei Bibliotheken verfügbar, die dieselbe API unter verschiedenen Lizenzen anbieten, um sie zu implementieren. Es bietet nette Dinge wie Befehlszeilenbearbeitung, Tab-Vervollständigung, Verlauf usw., die für jede CLI unerlässlich sind.

    – Tim Post

    8. April 2010 um 14:28 Uhr

1437200cookie-checkC readline-Funktion

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy