Hallo damaltor,
das weiß ich noch nicht, da ich noch nichts zu posten hatte. Evl. ist jetzt ein post drann, dann geht es. Schade geht nicht.

Hallo M1.R,
erst einmal zu deinen Kommentaren und Fragen im Code.

Du hast ja das Wesentliche auf alle Fälle schon raus bekommen.
//49 plätze bestehend aus 5 zeichen:
//Lottozahl=leerzeichen/bzw X - ganze 2stellige zahl - leerzeichen - strich
sprintf (Lottozahl [i], " %2d |", i + 1);
Komplett richtig so. Die 49 Strings werden mit 5 Zeichen belegt " NN |"
Dabei ist NN, ganz richtig, die 2-stellige Zahl vom Zähler i+1. Also 1 bis 49.
Na, da ist auch schon die Lösung für deine Frage:
// woher weiss er, welche zahl er schreiben muss?
if (Lottozahl [zuf][0] == ' ') // == ?
// keine lottozahl dann ein leerzeichen ?
Hier wird aus dem 'zuf'-ten String der Variablen Lottozahl das 0-te Zeichen verglichen mit einem einzelnen char-Zeichen.
== ist klar. Vergleiche irgendwas
"Hello world" ist auch klar. Ein String
'H' ist genau ein ASCII-Zeichen.
Der Unterschied zwischen Strings und Char-Zeichen ist der Aufbau im Speicher, (und die Behandlung dieser Speicherstruktur).
Die einzelnen Buchstaben des Strings sind jeweils in einem Byte gespeichert. Um den String aber zu beenden, so dass C weiß wann der String zu Ende ist, ist hinten dran immer ein 0x00 (kein einziges Bit im Byte ist gesetzt) angehängt.
Also:
"H" ist ein String und im Speicher werden ZWEI Byte benutzt. H und 0
'H' ist genau ein Byte lang. Nur H
Aus diesem Grund kann in einem String auch immer nur ein 'Nutz'-Zeichen weniger gespeichert werden.
char Lottozahl [49][6] -> Reserviere 49 * 6 Byte
5 Byte für die Buchstaben und Eins für Stringende 0x00

Somit ist deine "// keine lottozahl dann ein leerzeichen ?"-Frage bestimmt beantwortet.
Vergleiche das erste 'Nutz'-Zeichen [0] aus dem 'zuf'-ten String einfach mit einem Leerzeichen (' '). Oben hattest du ja schon richtig gesehen das 49 Strings beim ersten Zeichen mit Leerzeichen vorbelegt werden.
Ist also diese Stelle noch ein Leerzeichen, dann können wir diesen 'zuf'-ten Lottozahlen-Speicherplatz (den String) noch mit einem 'X' an der ersten Stelle beschreiben.
Wenn aber kein ' ' in diesem ersten 'Nutz'-Zeichen steht, dann ist da schon ein 'X' vorhanden, also nochmal würfeln.

if ( ! fmod (i, 7))
// wenn kein rest bei division i/7 da ist?
// also ganz am anfang und nach dem ende einer zeile
Ja, bei 0 auf alle Fälle, denn 0 durch irgendwas ist nun mal 0.
"nach dem ende einer zeile" heißt eher: alle 7 Durchläufe mal was tun. Denn die Zeilenlänge bestimmen wir ja erst mit der 7 in fmod().
Hier sollte eigendlich auch bei dir immer 0 als Ergebnis kommen, wenn i den Wert 7, 14, 21, 28, ... annimmt.
Und genau das passiert bei deinem Hex-File ja leider nicht, sondern nur bei 0 / 7.

Deshalb schaue ich jetzt einmal in dein Makefile. Mal sehen, ob ich was finde.

Gruß Sternthaler
P.S.: Oh Gott, ist das wieder lang geworden.