C String Feld füllen

-simonho-

Cadet 4th Year
Registriert
Juli 2012
Beiträge
119
Hallo an alle,

folgender Code soll durch Eingabe von einer Anzahl Einwohnern und einem Bundesland alle Städte auflisten und in eine Datei schreiben, die mehr Einwohner hat als eingegeben wurden. Die Daten dafür werden vorher aus einer Datei eingelesen.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "input3.h"

/* Die Konstanten:
 *  int MAX_LAENGE_STR - die maximale String Länge
 *  int MAX_LAENGE_ARR - die maximale Array Länge
 *  sind input3.c auf jeweils 255 und 100 definiert
 */

int main(int argc, char **argv) {
    if (argc < 3) {
        printf("Aufruf: %s <anzahl> <bundesland>\n", argv[0]);
        printf("Beispiel: %s 100 Bayern\n", argv[0]);
        printf("Klein-/Großschreibung beachten!\n");
        exit(1);
    }
    int anzahl = atoi(argv[1]);
    char *bundesland = argv[2];

    // Statisch allokierter Speicher
    char staedte[MAX_LAENGE_ARR][MAX_LAENGE_STR];
    char laender[MAX_LAENGE_ARR][MAX_LAENGE_STR];
    int bewohner[MAX_LAENGE_ARR];

    int len = read_file("staedte.csv", staedte, laender, bewohner); //read_file liest die Datei staedte.csv und überträgt die Daten in die Arrays 
                                                                                                      //staedte, laender und bewohner

    char *result[MAX_LAENGE_ARR];
    int c = 0;  //zählt die Anzahl der Städte mit genug Einwohnern im jeweiligen Bundesland
    char s[100];

    for (int i = 0; i < MAX_LAENGE_ARR; i++)
    {
        if (bewohner[i]>=anzahl && strncmp(bundesland,laender[i], MAX_LAENGE_STR) ==0 )
        {
            snprintf(s, 1000, "Die Stadt %s hat %d Einwohner.", staedte[i], bewohner[i]);
            result[c] = s;
            c++;
        } 
    } 

    write_file(result, c);    

    // Mithilfe von write_file(...) soll das Ergebnis in die "resultat.txt"
    // geschrieben werden. 

    // Dynamisch allozierter Speicher muss hier freigegeben werden.
}

Der Code funktioniert soweit mit einer Ausnahme. Und zwar wird in *result[] nur ein Pointer auf den zu speichernden String gespeichert, weshalb void write_file(char *result[], int len) immer nur die letzte Stadt übernimmt und in die Datei schreibt.
Die Werte des Strings s werden bei jedem Schleifenaufruf überschrieben.
Wie kann ich dieses Problem am besten lösen, ohne auf Vorrat ganz viele Strings zu deklarieren?

Viele Grüße -simonho-
 
Ich würde das write_file mit in die Schleife packen. Dann schreibt er es immer direkt nachdem er den String angepasst hat. So wie es jetzt ist, schreibt er logischerweise immer nur den letzen rein, da er nur diesen schreiben soll. Nach der Schleife ist c eben auf dem höhstem Wert.

Bin mir grad nur nicht sicher ob du ihm sagen musst das er immer in einer neuen Zeile dranhängen soll. Habe C ewig nicht mehr gemacht.
 
Schnellschuss ohne auf andere Fehler geprüft zu haben:
Code:
 ...
 char s[1000];

 for (int i = 0; i < MAX_LAENGE_ARR; i++)   {
   if (bewohner[i] >= anzahl && strncmp(bundesland, laender[i], MAX_LAENGE_STR) == 0)  {
       snprintf(s, 1000, "Die Stadt %s hat %d Einwohner.", staedte[i], bewohner[i]);
       result[c] = malloc((strlen(s)+1)*sizeof(char));
       strcpy(result[c], s);
       c++;
   }
  }
...
 
@blöderidiot: so lernt er doch nix, wenn du seine Hausaufgaben löst
 
Danke für eure Antworten.

Ic3HanDs:

c steht für die Anzahl an Zeilen, die aus dem result[] Array ausgelesen werden, wenn c z.B. 7 ist, werden die ersten 7 Stellen des Arrays jeweils mit einem Zeilenumbruch in die Datei geschrieben.
Die Idee das write_file mit in die Schleife zu packen hatte ich auch schon, allerdings fängt write_file bei jedem Aufruf wieder am Anfang der Datei an und überschreibt die alten Daten.

@blöderidiot

Zeile 7 in deinem Code funktioniert bei mir leider nicht und schreibt nur Müll ins Array. Zeile 8 verursacht bei mir folgende Fehlermeldungen: warning: implicit declaration of function ‘strcopy’ und Nicht definierter Verweis auf `strcopy'
collect2: error: ld returned 1 exit status

@bart0rn: Ich saß schon eine Weile an der Aufgabe und die Abgabezeit ist eh schon vorbei, mir geht es nur darum zu verstehen wie ich es hätte lösen können.
 
@bart0rn: OK, aber er hat ja schon einiges selber zusammengebastelt. Das Problem mit dem Feld von nichtinitialisierten Zeigern kann er nicht selber lösen.

@-simonho-:
Doch, mein Quelltext stimmt schon. Du mußt bitte nur noch mal genau hinschauen, was Du da getippt hast. Die Funktion heißt nicht "strcopy" und die Schleife:
Code:
...
for (int i = 0; i < MAX_LAENGE_ARR; i++)   {
...
darfst Du nur bis
Code:
i<len
durchlaufen. Das hatte ich vorhin gar nicht gleich gesehen. Denk mal darüber nach.
 
Zurück
Oben