Hallo Swen!
Erstmal zum - Tag: wenn Du die Leerzeichen zwischen weglässt, dann bleiben auch Deine Formatierungen erhalten. Dann kann unsereiner Dein Programm schon mal viel besser lesen. Abschliessen musst Du das Ganze dann mit .
Jetzt aber zum eigentlichen Problem. Ich erlaube mir mal dein Programm in kleineren Abschnitten „auseinanderzunehmen“.
int einlesen\_zahlen ( int \*zahlen, int anzahl )
{
int i=0;
char temp[256], c=0;
Das Array temp hat also 256 Elemente, die mit temp[0] bis temp[255] ansprechbar sind.
do
{
c = getchar();
Erstmal starten wir eine Schleife. Um den Abbruch kümmern wir uns später. OK. Sehen wir weiter.
Wir lesen ein Zeichen von der Standardeingabe und wenn dieses zwischen Hex 30 und Hex 39 liegt, dann machen wir folgendes:
while ( (c \>= 0x30) && ( c
Wenn das Zeichen eine Ziffer ist, dann starten wir eine for-Schleife, deren Abbruchbedingung allerdings schon vor dem ersten Durchlauf erfüllt ist (i ist eben 0 und nicht 256). Ich nehme an du wolltest hier for (i=0; i und irgendein anderer Speicherbereich enthalten jetzt also den gleichen Wert, nämlich den char, den wir soeben eingelesen haben.
Wir überschreiben das Array so lange in allen Zellen mit dem gleichen Wert (die Überindizierung lasse ich ab jetzt wieder aus dem Spiel) bis irgendetwas anderes als 0-9 kommt (z.B. EOF, a-z, ' '). Der Sinn dahinter bleibt mir zumindest vorerst verborgen. Wenigstens den Index-Fehler beheben wir trotzdem und schreiben im for <u>i aber wie gesagt, Sinn sehe ich darin immer noch keinen. Am Ende der Schleife ist i jetzt nebenbei bemerkt 256. Das ergibt den nächsten Fehler:<br><pre><br> temp[i+1] = "\n";<br></pre>
<br>Da i vor der Zuweisung schon 256 ist ergibt schon die Zuweisung an temp[i] eine falsche Indizierung, erst recht die an temp[i+1]. Stellen wir uns aber mal vor, wir hätten jetzt ein Array mit 256 Feldern, in dessen ersten 255 Zellen c steht und in der letzten '\n'. Du solltest C jetzt nach Möglichkeit nicht dazu bringen, das Ganze als String zu interpretieren. Da eine abschliessende '\0' fehlt wird das nämlich mit Sicherheit grauslich.<br><pre><br> zahlen[i] = atoi(temp[i]);<br></pre>
<br>Oje, jetzt hat er's doch getan... Wir halten fest: zahlen[256] (ist das überhaupt noch innerhalb des übergebenen Speicherbereichs? Solltest Du prüfen!) wird die Zahl zugewiesen, die sich aus der Konvertierung des Strings, der unmittelbar hinter temp[] beginnt, ergibt. Das war wohl nicht das gewünschte Resultat... <br><pre><br> c = getchar();<br> } while ( c != EOF );<br> return 0;<br>}<br></pre>
<br>Jetzt wird's aber schön langsam grob: Wir lesen nochmal ein Zeichen aus der Standardeingabe. Das wird zumindest dann ein interessantes (nämlich undefiniertes) Ergebnis liefern, wenn der zuvor eingelesene Character (und das könnte auch schon der erste gewesen sein, muss aber nicht) schon EOF war. Ganz nebenbei stellen wir noch fest, dass wir den Übergabeparameter anzahl nicht verwendet haben - wofür auch immer der gedacht war.<br><br>Fazit: In diesem Sourcecode ist so gut wie nichts richtig, und was zumindest keinen Fehler produziert erscheint mir sinnlos. Deswegen will ich auch davon absehen, dir hier eine Funktion zu schreiben, die das tut, was du dir erwartest. Vielleicht postest du ja eine Version des Codes, in dem du angibst, was du mit dem jeweiligen Abschnitt (im Fall des Falles jeder Zeile) zu tun beabsichtigst, was ganz nebenbei ohnehin immer eine gute Idee ist (/* Kommentare */ und so).<br><br>Nichts für ungut, ich helfe dir wirklich gerne weiter, aber der Code von Dir ist wirklich recht weit jenseits von Gut und Böse. Vielleicht kanst Du ja auch noch vom Code, der die Funktion aufrufen soll einiges posten, und das bringt dann etwas mehr Licht in die Sache.<br>
<blockquote>
thx pfefferkeks<br>
</blockquote>
<br>Liebe Grüße,<br>Martin<br><br></u>