?
Strg-D schließt den Standardeingabestrom (setzt das eof-Bit auf stdin). Das bedeutet, dass danach alle Versuche, etwas von stdin einzulesen, scheitern, und darauf kannst du reagieren. Ein einfaches Beispiel, wie man damit umgehen kann, ist
char zeile[1024];
while(fgets(zeile, sizeof(zeile), stdin) != NULL) {
/* Hier zeile verarbeiten */
}
...weil fgets NULL zurückgibt, wenn der Eingabestrom, aus dem gelesen werden soll, geschlossen (oder sonstwie nicht lesbar) ist. In diesem Beispiel kriegt man zwar Probleme, wenn eine Zeile länger ist als 1023 Zeichen, aber ich nehme an, dass das für deine Zwecke unproblematisch ist.