Ein- und Ausgabe eines Strings



  • Hallo Leute,

    ich mal wieder ein Problem mit dem Verarbeiten von Strings:

    Mein Code sieht folgendermaßen aus (nur die wichtigen Zeilen):

    char *Operator[256];
    
    for (j = 1; j <=n; j++)
    {
            fscanf(InputIni, "%c*[^\n]", &Operator[j]);
    	getc(InputIni);
    }
    
    for (j = 1; j <=n; j++)
    {
    	fprintf(LogFile, "%c\n", Operator[j]);
    }
    

    Die Textdatei die ich einlese, sieht so aus:
    x
    y
    z

    Ausgegeben wird mir dann aber nur Leerzeichen...

    Wo ist der Fehler?

    Danke schon mal!!



  • char *Operator[256]; //256 char-Zeiger = Blödsinn
    
    fscanf(InputIni, "%c*[^\n]",
        &Operator[j]); //Zeiger auf Zeiger (char **) = Blödsinn
    

    Versuch mal, 3 char-Arrays für die Werte anzulegen und fscanf richtige Parameter zu geben.



  • da hab ich das Problem, dass das nicht nur 3 Werte(x,y,z) sondern auch beliebt mehr werden können. Wie mache ich das dann?



  • Hallo,

    Christiangr schrieb:

    Hallo Leute,

    ich mal wieder ein Problem mit dem Verarbeiten von Strings:

    so wie das aussieht, willst du einzelne Zeichen einlesen, keine Strings.
    Dafür brauchst du das ganze Geschnörkel a la

    "%c*[^\n]"
    

    nicht.
    Es tut ein

    "%c"
    

    Christiangr schrieb:

    da hab ich das Problem, dass das nicht nur 3 Werte(x,y,z) sondern auch beliebt mehr werden können. Wie mache ich das dann?

    und ein passendes, bzw. dynamisch wachsendes Array, oder noch besser ne Liste.



  • das wird trotzdem nicht gehen, solange *operator[] auf keine freien speicherbereich zeigt, sonst gibts einen zugriffsfehler, da moderne Betriebssysteme den Speicherzugriff überwachen, oder? das ginge nur wenn definition und deklaration gleichzeitig erfolgen.
    also entweder malloc aus stdlib.h includieren oder einfacher ein doppeltes array à la char[][]

    #include <stdlib.h>
    int main(){
      char *operator[256];
      int i;
      for(i=0; i<256; i++)
        operator[i]=malloc(sizeof(char)*1);  //effektiv ist das ein array char[256][1]
      i=0;
      while(!feof && i<256)
      {
        fscanf(input, "%c", operator[i++];
        fgetc(input);
      }
    }
    

    ein char[256][1] is aber quatsch, da reicht auch char[256],
    wenn du statt chars string einlesen willst und "%s" nimmst, brauchst du auch den Zeilensprung nicht mehr zu entfernen, das macht fscanf.



  • Immer diese Verquickung von Datei- und fachlicher Auswertung mittels einer Funktion fscanf. Ich halte die konsequente Trennung für besser, z.B.

    char zeile[256],*zeichen=calloc(1,1);
    FILE *datei=fopen("bla.txt","rt");
    
    while( fgets(zeile,sizeof zeile,datei) )
    {
      zeichen=realloc(zeichen,strlen(zeichen)+2);
      zeichen[strlen(zeichen)+1]=0;
      zeichen[strlen(zeichen)]=*zeile;
    }
    fclose(datei);
    puts(zeichen);
    free(zeichen);
    

    Für irgendwelche Schlauberger: Nein der Beispielcode berücksichtigt nicht alle Systemrandbedingungen und Dateiinhaltstrukturen.


Log in to reply