1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Problem bei For-Schleife in C

Discussion in 'Programmieren' started by Mgredeck, Dec 7, 2008.

Thread Status:
Not open for further replies.
  1. Mgredeck

    Mgredeck Byte

    Hallo!

    Ich habe ein Problem bei nachfolgendem Programmausschnitt.
    Aus einer Datei sollen mir der Reihe nach, abwechselnd eine Zahl und ein darauf folgendes Zeichen eingelesen werden. Die Zahl vor dem Zeichen bestimmt die Anzahl wie oft das Zeichen ausgegeben werden soll. Die For-Schleife soll nun nacheinander die Zeichen ausgeben bis richtige Anzahl erreicht ist.

    Mein Problem besteht nun darin das ich nicht weiss wie ich das in der Schleife formulieren soll. Bei der Formulierung (k < anzahl) folgt nur eine Endlosschleife mit hässlichen Fehlern. Aus sonst habe ich alles mögliche ausprobiert.

    Wer könnten mir sagen wie man diese Schleife vernünftig zum laufen bringen kann? Danke!

    char zeichen[sl];
    unsigned int anzahl[sl], i=0, j=0,k=0, l=0,


    while (!feof(file))
    {
    fscanf(caa, "%u%*c%c%*c ", &anzahl, &zeichen);

    i++;

    for (j=0, k=0; (k < anzahl); j++, k++)
    {
    printf("%c", zeichen[j]);
    }
    }
     
  2. Mgredeck

    Mgredeck Byte

    Das j++ in der for-Schleife war ein Fehler. "Richtig" heisst es:

    while (!feof(file))
    {
    fscanf(caa, "%u%*c%c%*c ", &anzahl, &zeichen);

    i++;

    for (j=0, k=0; (k < anzahl); k++)
    {
    printf("%c", zeichen[j]);
    }
    }


    Aber trotzdem erkennt die Schleife nicht den unsigned-int-Wert zeichen aus der vorherigen Schleife.
     
  3. daboom

    daboom Megabyte

    Hier liegt, glaub ich, ein Grundproblem vor:

    Ich kann manche Dinge bei Dir im Quellcode gar nicht deuten. Z.B. initialisierst Du die beiden Felder "zeichen" und "anzahl" beide auf die größe "sl". Woher kommt dieser Wert? Und es ist eigentlich unlogisch, dass Du pro Zeile genauso viele Zeichen erwartest (Größe von "zeichen") wie Du insgesamt Zeilen erwartest (Größe von "anzahl", ich vermute, dass hier jeweils die Anzahl der Zeichen pro Zeile gespeichert werden soll?)

    Deine Änderung (mit dem weglassen von j++) sollte eigentlich dazu führen, dass immer das gleiche Zeichen ausgegeben wird, nämlich immer das an Index "j" (= 0).

    Vielleicht solltest Du einfach mal den kompletten Quellcode posten.
    Ansonsten hätte ich es folgendermaßen gemacht (in etwa, kenn mich in der C-API jetzt nich so gut aus ;)):

    Code:
    
    unsigned int anzahl;
    char* zeichen;
    
    while (!eof(file)) {
       // Anzahl der Zeichen aus Datei in "anzahl" lesen (mit fscanf???)
    
      // Speicher für die einzulesenden Zeichen anlegen
      zeichen = (char*) malloc(sizeof(char) * anzahl);
      // Zeichen einzeln in "zeichen" reinlesen
      for (int i = 0; i < anzahl; ++i) {
        zeichen[i] = ??? // Wahrscheinlich wieder was mit fscanf ;)
      }
      // So, jetzt stehen die Zeichen in "zeichen" drin
    
      // Jetzt kannst Du sie nochmal einzeln ausgeben
      for (i = 0; i < anzahl; ++i) {
        printf("%c", zeichen[i]);
      }
    
      // Und noch ein Enter hinterher
      printf("\n");
    }
    
    Ist natürlich reichlich sinnlos, die Zeichen zu speichern, nur um sie wieder auszugeben. Da wäre es sinnvoller, die gar nicht zwischenzuspeichern, sondern jedes eingelesene zeichen gleich wieder auszugeben.
     
Thread Status:
Not open for further replies.

Share This Page