stdin getline wrapper

Nov 02 2020

Ich möchte eine Zeile aus stdin lesen, ausgenommen das Zeilenumbruchzeichen. Ich habe die Funktion geschrieben:

/* read in a line from stdin, NULL on failure
 * does not include trailing newline
 */
char*
readStdinLine() {
        char* buffer;
        size_t bufsize = 32;
        size_t characters;

        buffer = (char *) malloc(bufsize * sizeof(char));
        if (buffer == NULL)
                return NULL;

        characters = getline(&buffer, &bufsize, stdin);
        buffer[--characters] = '\0';

        char* text = (char *) malloc(characters);
        for (int i = 0; i < characters + 1; i++) {
                text[i] = buffer[i];
        }

        free(buffer);

        return text;
}

Dies scheint unzulänglich zu sein. Ich lese die Zeile im Wesentlichen zweimal, einmal in getline und einmal, um die nachfolgende neue Zeile zu entfernen. Das scheint nicht der speichereffizienteste Algorithmus zu sein, und ich möchte die neue Zeile entfernen, ohne sie zu kopieren, wenn dies überhaupt möglich ist.

Ich bin sehr neu in C (habe C ++, Java usw. verwendet, aber nie eine Systemsprache ohne Objekte), daher würde ich es begrüßen, all die Dinge im Codestil zu lernen, die ich auch falsch gemacht habe. Vielen Dank!

Antworten

7 MartinYork Nov 02 2020 at 01:17

Diese Funktion kann folgendermaßen geschrieben werden:

char* readStdinLine()
{
        char*  buffer  = NULL;
        size_t bufsize = 0;
        ssize_t characters = getline(&buffer, &bufsize, stdin);
        if (characters == -1) {
            free(buffer);
            buffer = NULL;
        }
        else if (buffer[characters-1] == '\n') {
            buffer[characters-1] = '\0';
        }
        return buffer;
}

Die getline()Funktion macht alles was Sie brauchen. Sie müssen nur nach Fehlern suchen und das neue Zeilenzeichen entfernen.