1 Pluspunkt 0 Minuspunkte

Wie kann ich ein Programm mit Pipe aufrufen und das Input lesen?

C:\> ipconfig | main.exe

Die Variable argv ist bei so einem Aufruf nämlich leer.

von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Wenn du ein C-Programm mit Pipe aufrufst, wird die Eingabe nicht über die Kommandozeilenargumente (argv) übergeben, sondern über die Standardeingabe (stdin).

#include <stdio.h>

int main() {
    char input[100];

    // Lese die Eingabe von stdin
    fgets(input, sizeof(input), stdin);

    // Gib die Eingabe aus
    printf("Eingabe: %s\n", input);

    return 0;
}

Wenn du den genauen Umfang des Eingabewerts nicht kennst und er potenziell sehr groß sein kann, kannst du dynamische Speicherallokation verwenden, um den Eingabepuffer anzupassen. Anstatt ein festes Array zu verwenden, kannst du die Funktion malloc verwenden, um Speicherplatz für den Eingabepuffer zur Laufzeit zuzuweisen.

#include <stdio.h>
#include <stdlib.h>

#define INITIAL_BUFFER_SIZE 100

int main() {
    char *input = malloc(INITIAL_BUFFER_SIZE * sizeof(char));
    if (input == NULL) {
        fprintf(stderr, "Fehler bei der Speicherallokation.\n");
        return 1;
    }

    size_t buffer_size = INITIAL_BUFFER_SIZE;
    size_t input_length = 0;
    int c;

    // Lese Zeichen von stdin, bis EOF erreicht ist
    while ((c = getchar()) != EOF) {
        input[input_length++] = (char)c;

        // Überprüfe, ob der Eingabepuffer voll ist, und erweitere ihn bei Bedarf
        if (input_length == buffer_size) {
            buffer_size *= 2;
            char *tmp = realloc(input, buffer_size * sizeof(char));
            if (tmp == NULL) {
                fprintf(stderr, "Fehler bei der Speicherallokation.\n");
                free(input);
                return 1;
            }
            input = tmp;
        }
    }

    // Füge das Null-Byte am Ende hinzu, um einen C-String zu bilden
    input[input_length] = '\0';

    // Gib die Eingabe aus
    printf("Eingabe: %s\n", input);

    // Gib den Speicher frei
    free(input);

    return 0;
}
von