Probleme mit Sting im Array in C



  • Nach Zeile 61 zeigt "Datenbank[i]" zwar auf "vorname", aber du hast natürlich nichts kopiert.



  • 1. fflush(stdin) sollte schonmal weg(such mal hier im Forum nach "fflush(stdin)"). Vllt. hilft das schon iwie weiter.

    2. du kopierst da nur einen Zeiger herum. Wenn du nach der 2. Eingabe den ersten wert noch beibehalten möchtest, musst du mit diesem mit strcpy eine Wertekopie durchführen.


  • Mod

    1. Du gehst davon aus, dass ein scanf("%d",&key); noch irgendetwas nach einer Zahl aus der Standardeingabe entfernen würde. Dem ist nicht so, es wird nur bis zum Ende der ersten gefundenen Zahl gelesen, nicht weiter. Da man oftmals Zahleneingaben mit einem newline abschließt, ist dieses danach noch in der Standardeingabe vorhanden. Und ein fgets, welches bis zum nächsten newline liest, liest dann gar nichts.
    2. Das mit dem Kopieren und Zuweisen von Arrays, insbesondere Zeichenketten, guckst du dir besser noch einmal in einem Buch an. Mit dem Operator= geht das jedenfalls nicht, das macht ganz was anderes.

    Allgemeiner Kommentar: Tut das Not, alles global zu machen? Wenn du das vernünftig machen würdest, dann hättest du dich schon viel früher mit den Eigenheiten von Arrays beschäftigen müssen, dann wäre 2. erst gar nicht passiert.



  • Wutz schrieb:

    scanf("%d", &aus);
       
        if(DATENBANK[aus] == 0)
    

    Was soll dieser Vergleich machen?
    Er macht sicher nicht das, was du beabsichtigst.
    Hast du schon mal was von struct gehört? Das würde sich hier anbieten.

    Doch der funzt. Er soll ja nur prüfen was drinn ist.

    SeppJ schrieb:

    2. Das mit dem Kopieren und Zuweisen von Arrays, insbesondere Zeichenketten, guckst du dir besser noch einmal in einem Buch an. Mit dem Operator= geht das jedenfalls nicht, das macht ganz was anderes.

    strcpy(DATENBANK[count], vorname); << das ja falsch aber wie wäre es richtig?

    SeppJ schrieb:

    Allgemeiner Kommentar: Tut das Not, alles global zu machen? Wenn du das vernünftig machen würdest, dann hättest du dich schon viel früher mit den Eigenheiten von Arrays beschäftigen müssen, dann wäre 2. erst gar nicht passiert.

    Sry, I know. Ich brauch den Kram halt fürs Studium. Und muss/kann/soll halt ein Semester Grundlagen der Informatik machen. C ist so mal garnet mein Ding.

    Bekommt man das Prog noch gerettet oder wegwerfen (morgen ist Abgabe)?

    THX an alle die sich mein Stuss hier antun



  • Wenn der Name (Vor und Nachname zusammen) von deinem Studenten größer als 49 Zeichen ist, bekommst du schon beim strcat(vorname, nachname); ein Problem.
    in vorname ist nur Platz für 50-1 Buchstaben.



  • DirkB schrieb:

    Wenn der Name (Vor und Nachname zusammen) von deinem Studenten größer als 49 Zeichen ist, bekommst du schon beim strcat(vorname, nachname); ein Problem.
    in vorname ist nur Platz für 50-1 Buchstaben.

    ok thx. das problem ist bislang noch garnet aufgetreten. XDXD



  • strcpy(DATENBANK[count], vorname); << das ja falsch aber wie wäre es richtig?

    Würde funktionieren, wenn du Datenbank mit

    DATENBANK[256][50];
    

    anlegst.

    Aber das geht halt auch nur mit dem Vornamen. Ich glaube dein kleines Projekt schreit richtig nach einem struct.

    Dann könntest du ein Array mit Strukturen in DATENBANK hinterlege.



  • Mein "Testprogramm"

    #include <stdio.h>
    
    int main()
    {
      char *DATENBANK[256];
      DATENBANK[0]="dies ist der erste text";
      DATENBANK[1]="dies ist der zweite text";
      DATENBANK[2]="dies ist der dritte text";
    
      printf("%s\n%s\n%s",DATENBANK[0],DATENBANK[1],DATENBANK[1]);
      getch();
      return 0;
    }
    

    macht genau was es soll. jetzt muss ich halt nur "dies ist der x-te text" durch meinen zusammengewürfelten string ersetzen (eigentlich) so mache ich es zumindest in anderen sprachen. und das bekomme ich halt in c net hin. ist das denn in c nicht möglich?

    werde mir struct mal angucken



  • werde mir struct mal angucken

    rall ich net.
    ich schreibe grad seit 4 wochen c und das nur n kleines nebenfach. das mir im moment echt zu hoch.



  • Zu hoch?

    Na gut... nehmen wir an du hast ein Stück Käse und ein Stück Brot und ein Stück Wurst und ein Stück Fertigpizza... da du gerade einkaufst und die Sachen recht groß sind, hast du extra einen Behälter Einkaufswagen dafür.

    Nehmen wir weiter an du hast einen String Vornamen und einen String Nachnamen und einen Int Alter und einen Int Geschlecht... wo packt man das nun rein... klar in den Behälter Struct.

    Damit es noch lustiger wird, kannst du deinem struct sogar einen Namen geben und dann auch so benutzen. Betrachte struct grob als eine Schachtel für mehrere Dinge.

    struct Schachtel { // von mir aus auch Einkaufswagen oder sogar Profil
    char Name[50];
    char Nachname[50];
    ...
    }
    
    int main(void) {
    struct Schachtel Datenbank[50];
    strcpy(Datenbank[0].Name, "Der Vorname");
    ... // Verfahre bei Stringkopien gleich
    // bei Integer kannst du da = nutzen
    }
    

    Wenn es nur ein Nebenfach ist, dann müsstet ihr ja aber umso mehr darauf vorbereitet worden sein.

    Puuh, ab nach Hause... falls da der Eile wegen ein Schnitzer drinne ist, dann verbessert mal bitte jemand.



  • Hab es jetzt aus struct umgeschrieben.

    unter windoof gehts unter linux nicht.
    linus überspringt die Vornamenseingabe und speichert keien inhalt

    #include <stdio.h>
    #include <string.h>
    
    int erstellen(),suchen(),count=0;
    char vorname[50],nachname[50],matnr[15],stgang[50];
    char *datenbank[256];
    
    int main() {
      int key = 3;
      printf("Willkommen im Studentenverzeichnis\n\n"); 
      do{
        printf("Was wollen sie tun?\n[1] Eintrag ausgeben\n[2] Eintag anlegen\n[0] Beenden\n\n");
        scanf("%d",&key); 
        if(key == 1) suche();
        if(key == 2) erstellen();
      }while(key != 0); 
    return 0;
    }
    
    int erstellen(){
        fflush(stdin);//Eingebebuffer leeren
          struct student {
          char Vorname[20];
          char Nachname[20];
          char Matnr[15];
          char Stgang[20];
      } ;
      struct student datenbank[256];
        printf("\n\nEINTRAG ERSTELLEN\n\n");
    
        printf("Vorname: ");
          fgets(vorname, sizeof(vorname), stdin);
          vorname[ strlen( vorname ) - 1 ] = 0x0;//Zeilenumbruch entfernen
          strcpy(datenbank[count].Vorname, vorname);
    
        printf("Nachname: ");
          fgets(nachname, sizeof(nachname), stdin);
          nachname[ strlen( nachname ) - 1 ] = 0x0;//Zeilenumbruch entfernen
          strcpy(datenbank[count].Nachname, nachname);
    
        printf("Matrikelnummer: ");
          fgets(matnr, sizeof(matnr), stdin);
          matnr[ strlen( matnr ) - 1 ] = 0x0;//Zeilenumbruch entfernen
          strcpy(datenbank[count].Matnr, matnr);
    
        printf("Studiengang: ");
          fgets(stgang, sizeof(stgang), stdin);
          stgang[ strlen( stgang ) - 1 ] = 0x0;//Zeilenumbruch entfernen
          strcpy(datenbank[count].Stgang, stgang);
    
        printf("\n\n%s,%s %s %s\n",datenbank[count].Nachname,datenbank[count].Vorname,datenbank[count].Matnr,datenbank[count].Stgang);
        printf("In Zeile %d gespeichert.\n\n",count);
        count++;
        return 0;
    }
    
    int suche() {
              struct student {
          char Vorname[20];
          char Nachname[20];
          char Matnr[15];
          char Stgang[20];
      } ;
      struct student datenbank[256];
        int aus;
        printf("\n\nEINTRAG SUCHEN\n\n");
        printf("Welchen Datensatz wollen sie einsehen?\n");
        scanf("%d", &aus);
        printf("\n\n%s,%s %s %s\n",datenbank[aus].Nachname,datenbank[aus].Vorname,datenbank[aus].Matnr,datenbank[aus].Stgang);
    
        return 0;
    }
    

  • Mod

    Tja, das kommt davon, wenn man fflush(stdin) benutzt:
    http://www.c-plusplus.net/forum/39349



  • Das löst aber nur eines der Probleme


  • Mod

    Varulv schrieb:

    Das löst aber nur eines der Probleme

    Das liegt da dran, dass das datenbank in deiner Funktion nicht mit dem globalen datenbank zu tun hat. Selber Schuld, wenn man globale Variablen benutzt.



  • Das Problem ist das \n von der Entertaste nach der Eingabe von key. Da das nicht zu einer Zahl gehört, liest es scanf() nicht ein. Es bleibt im Eingabepuffer.

    Dieses \n findet fgets() und freut sich, dass die Eingabe schon beendet ist.

    Lösung findest du bei http://www.c-plusplus.net/forum/p1146014#1146014
    Diese while Zeile musst du am besten nach jedem scanf() machen.



  • #include <stdarg.h>
    
    int myscanf (const char *format, ...)
    {
       int c = 0;
       int cnt=0;
       va_list params;
       va_start (params, format);
       cnt = vscanf (format, params);
       va_end (params);
       while ((c = getchar()) != EOF && c != '\n'); // kein {} block, stimmt so   
       return cnt;
    }
    

Anmelden zum Antworten