Probleme mit Sting im Array in C



  • 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