typedef struct und strcmp

mar2050

Neues Mitglied
Hallo, ich hoffe mir kann einer weiterhelfen. Ich versuche zwei Array zu vergleichen. Durch den typedef struct klappt dies aber leider nicht. Hier einmal mein Code. Der typedef ist im Projekt in einer Header.h gespeichert.

C:
typedef struct {
    char vname[150];
    char nname[150];
    int Matrikel;
    int alter;
    int Start;
    int mobil;
    char studiengang[150];
    char adresse[150];
        int hausnr;
        int plz;
        char stadt[150];

    char Uname[150];
    char uadresse[150];
    int uhausnr;
    int uplz;
    char ustadt[150];

    char uvname[150];
    char unname[150];
    int umobil;

}per;

int suchen(per Person[150]) {
   
    char suchbegriff[150];
    int i;
    for (i = 0; i < 150; i++) {
       
        suchbegriff = i;
    }
    printf("Suchbegriff eingeben: ");
    scanf("%c", suchbegriff);
    for (i = 0; i < 150; i++) {
        
        if (Person == suchbegriff) {
            printf("Ist an der Stelle %i gleich", i);
            
        }

        else {
            printf("Kein Suchergbnis");
        
        
        }
    }
    return EXIT_SUCCESS;
}
 
Zuletzt bearbeitet von einem Moderator:
C:
typedef struct {
  char vorname[150];
  char nachname[150];
  int alter;
  int mobil;
  char adresse[150];
  int hausnr;
  int plz;
  char stadt[150];

} per; //Definierung in der Header.h Datei

//eigentliche Funktion
int suchen(per Person[150]) {
  int i;
  char suchbegriff[150];
  per Person[150];
  printf("Suchbegriff: ");
  scanf("%c", suchbegriff);

  for (i = 0; i < 150; i++) {

    //jeden Platz im Array durchgehen und bei Übereinstimmung Wert des Speicherplatzes zurück geben
  }
}
 
  • Der format specifier für scanf müsste dann "%s" sein.
  • "Person" ist in der Funktion schon durch die Übergabe definiert.
  • In der Schleife dann per strcmp vergleichen, ob vorname[i] (oder nachname, adresse, was auch immer) mit dem Suchbegriff übereinstimmt. Dies ist kein Vergleich zweier Arrays, wie Du oben behauptest.

C:
#include <stdio.h>
#include <string.h>

typedef struct {
  char vorname[150];
  char nachname[150];
  int alter;
  int mobil;
  char adresse[150];
  int hausnr;
  int plz;
  char stadt[150];
} per;

int suchen(per Person[150]) {
  int i;
  char suchbegriff[150];

  //printf("Suchbegriff: ");
  //scanf("%s", suchbegriff);

  // Test 1:
  //strcpy(suchbegriff, "Hund");

  // Test 2:
  strcpy(suchbegriff, "Lisa");

  for (i = 0; i < 150; i++) {
    if (strcmp(Person[i].vorname, suchbegriff) == 0)
      return (i);
  }

  return (-1);
}

int main() {
  per Person[150];

  strcpy(Person[0].vorname, "Hans");
  strcpy(Person[1].vorname, "Paul");
  strcpy(Person[2].vorname, "Lisa");

  int Position = suchen(Person);

  if (Position == -1) {
    printf("Nicht gefunden.");

  } else {
    printf("Gefunden an Position: %d", Position);
  }

  return (0);
}
 
Vielen Dank @BAGZZlash, das ist genau was ich meine und brauche. Gibt es noch eine Möglichkeit, bei dem strcpy Befehl, die Daten nicht "manuell" einzugeben? Diese sollen zuvor bereits vom Benutzer eingegeben worden sein.
 
Klar, statt String-Literalen kannst Du da z.B. direkt Eingaben aus scanf einfüttern.

Vielleicht noch ein, zwei Hinweise zum Stil:
  • Eigentlich verwendest Du ganz gute, sprechende Variablennamen. Dennoch solltest Du noch einmal über "per" und "Person" nachdenken: Der struct beschreibt eine Person, diese hat einen Namen, ein Alter usw. Warum also nicht diesen Typ "Person" nennen? Wenn Du nun ein Array von mehreren davon deklarierst, solltest Du dieses entsprechend "Personen" (also Plural) nennen.
  • Du deklarierst relativ viel Speicher auf dem Stack. Ich verstehe schon, dass es hier nicht um dynamische Speicherverwaltung geht und Ihr das vielleicht noch gar nicht hattet, dennoch solltest Du Dich fragen, ob pauschal 150 Elemente des Arrays wirklich sein müssen (es sei denn, das ist so die Vorgabe in der Aufgabenstellung).
  • Damit zusammenhängend verwendest Du immer diese "150" im Code, und zwar sogar für verschiedene Dinge: Einmal als Anzahl von Elementen in Deinem Array, und dann immer wieder für die Anzahl an Chars in Deinen Strings. Mein Tip wäre, am Anfang des Codes zumindest einen const int zu deklarieren, um diese Zahl einmalig festzulegen und dann im Code immer wieder diesen int zu verwenden. So ist der Code lesbarer und einfacher wartbar.
  • Eine Suchfunktion baut man üblicherweise so, dass sie keine eigenen Nutzerinteraktionen erfordert. Man sollte ihr zumindest zwei Parameter übergeben, nämlich einmal, was durchsucht werden soll (das hast Du schon) und dann noch, wonach gesucht werden soll (das fragst Du innerhalb der Funktion vom User ab). Versuch' mal, die Nutzerinteraktion in die main() zu verlagern und die Suchfunktion von Nutzereingaben freizuhalten.
Schau' Dir das mal an:

C:
#include <stdio.h>
#include <string.h>

#define NUMCHARS 150
#define NUMELEMENTS 10

typedef struct {
  char Vorname[NUMCHARS];
  char Nachname[NUMCHARS];
  int Alter;
  int Mobil;
  char Adresse[NUMCHARS];
  int Hausnummer;
  int Postleitzahl;
  char Stadt[NUMCHARS];
} PERSON;

int suchen(PERSON *Personen, char *Suchbegriff) {
  int i;

  for (i = 0; i < NUMELEMENTS; i++) {
    if (strcmp(Personen[i].Vorname, Suchbegriff) == 0)
      return (i);
  }

  return (-1);
}

int main() {
  PERSON Personen[NUMELEMENTS];

  strcpy(Personen[0].Vorname, "Hans");
  strcpy(Personen[1].Vorname, "Paul");
  strcpy(Personen[2].Vorname, "Lisa");

  char Suchbegriff[NUMCHARS];
  printf("Suchbegriff: ");
  scanf("%s", Suchbegriff);

  int Position = suchen(Personen, Suchbegriff);

  if (Position == -1) {
    printf("Nicht gefunden.");

  } else {
    printf("Gefunden an Position: %d", Position);
  }

  return (0);
}
 
Zurück
Oben Unten