Vektoren von Strukturen



  • Also ich will einen Wert abfragen und überprüfen. Es gibt 6 Mitarbeiter in einer Firma und ich gebe einen Namen ein, der dann untersucht wird, ob der Betreffende mit diesem Namen in der Firma ist.

    Das funktioniert auch gut, aber leider führt er die If-Abfrage nicht richtig aus und sagt mir die ganze Zeit, dass kein Mitarbeiter mit dem jeweiligen Namen in der Firma ist, obwohl es passen müsste:

    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    #include <conio.h>
    
    struct Daten
    {
      char *nachname;
    } kunde[] =
    {
      "Gilbert",
      "Thieme",
      "Keufen",
      "Vlach",
      "Holler",
      "Reitinger",
    };
    
    int main(int argc, char* argv[])
    {
      char *eingabe;
      int i;
    
      printf("Bitte geben sie einen Kundennamen bitte ein: \n");
    
      eingabe = (char *)malloc(sizeof(char));
      fgets(eingabe, strlen(eingabe), stdin);
    
        for (i = 0; i < 5; i++)
      {
        if (eingabe == kunde[i].nachname)
        {
          printf("Diesen Mitarbeiter gibts in dieser Firma.\n");
        }
        else
        {
          printf("Keine Ausgabe !!");
        }
      }
      getch();
      return 0;
    }
    


  • Du vergleichst Zeiger bei

    eingabe == kunde[i].nachname
    

    und das ist ja wohl nie war 😉

    nimm strcmp(gibt bei Gleichheit 0 zurück)

    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    #include <conio.h>
    
    struct Daten
    {
      char *nachname;
    } kunde[] =
    {
      "Gilbert",
      "Thieme",
      "Keufen",
      "Vlach",
      "Holler",
      "Reitinger",
    };
    
    int main(int argc, char* argv[])
    {
      char *eingabe;
      int i;
    
      printf("Bitte geben sie einen Kundennamen bitte ein: \n");
    
      eingabe = (char *)malloc(sizeof(char));
      fgets(eingabe, strlen(eingabe), stdin);
    
        for (i = 0; i < 5; i++)
      {
        if (!strcmp(eingabe, kunde[i].nachname))
        {
          printf("Diesen Mitarbeiter gibts in dieser Firma.\n");
        }
        else
        {
          printf("Keine Ausgabe !!");
        }
      }
      getch();
      return 0;
    }
    


  • ah okay.... man kann auch direkt

    if (*eingabe == *kunde[i].nachname)
    

    machen, aber die Lösung mit strcmp ist wesentlich schöner ! 😉



  • Hmmm ...

    Wo ist der "Vektor"?

    eingabe = (char *)malloc(sizeof(char));
    

    Ein (1) char sind 8bit=1Byte, mehr nicht.

    Ja, und @YASC hat den Rest schon geschrieben.

    Blackbird



  • cHillb3rT schrieb:

    ah okay.... man kann auch direkt

    if (*eingabe == *kunde[i].nachname)
    

    Das kann man. Man sollte sich aber darüber im Klaren sein, dass man dann nur die Anfangsbuchstaben vergleicht. Um Strings zu vergleichen braucht es halt strcmp() oder ähnliches...

    eingabe = (char *)malloc(sizeof(char));
      fgets(eingabe, strlen(eingabe), stdin);
    

    Dass das malloc() so keinen Sinn macht wurde ja schon erwähnt. Aber was biiteschön soll das strlen()? malloc() gibt dir einen Speicherbereich von dem du ausgehen musst, dass er "irgendwas" enthält. strlen() wird dir garantiert nicht die Größe des allozierten Speicher liefern...
    Mach das doch besser mit einem stinknormalen buffer. Du weisst vor den Eingabe ja eh nicht wie groß sie werden wird, also ist dynamische Speicherreservierung mit malloc() hier vollkommen sinnlos...



  • Man muss auch noch den Index auf 6 durchzählen lassen. Des hatte ich vergesen, damit man alle Mitarbeiter durchgehen kann:

    for (i = 0; i < 6; i++)
    


  • zufaulzumeinloggen schrieb:

    Hmmm ...

    Wo ist der "Vektor"?

    eingabe = (char *)malloc(sizeof(char));
    

    Ein (1) char sind 8bit=1Byte, mehr nicht.

    Ja, und @YASC hat den Rest schon geschrieben.

    Blackbird

    1byte muss nicht zwangsläufig 8bit beinhalten.



  • eingabe = (char *)malloc(sizeof(char)); 
    fgets(eingabe, strlen(eingabe), stdin);
    

    ist dir klar, dass das nie im Leben funktionieren wird? sizeof(char) ist 1, d.h. du reserviertst gerade ein Byte, d.h. ein Zeichen, da kannst glatt einfach ein char und nicht char* benutzen, denn strings sollten mindestens 2 Stellen haben, denn \0 muss enthalten sein.

    2. strlen(eingabe) liefert die Anazhl der Zeichen bis \0. malloc reserviert den Speicher, aber eingabe hat belibige Werte und somit ist die Ausgabe von strlen(ausgabe) undefiniert. Was du meinst ist sizeof, aber da würde auch nicht gehen, denn ein char* belegt (in x86 Architekturen) 4 Bytes und sizeof(eingabe) wäre immer 4, egal wieviel Speicher du reservierst.

    Richtig wäre:

    ...
    int size=30; /* oder was weiß ich wieviel */
    ...
    eingabe = (char *)malloc(size); 
    fgets(eingabe, size, stdin); /* liest max. size-1 Zeichen, falls kein EOF oder \n gelesen wird */
    


  • cHillb3rT schrieb:

    Also ich will einen Wert abfragen und überprüfen. Es gibt 6 Mitarbeiter in einer Firma und ich gebe einen Namen ein, der dann untersucht wird, ob der Betreffende mit diesem Namen in der Firma ist.

    Das Programm hat mehrere Schwächen.

    Nur ein paar Anmerkungen dazu:

    struct Daten
    {
      char *nachname;
    } kunde[] =
    {
      "Gilbert",
      "Thieme",
      "Keufen",
      "Vlach",
      "Holler",
      "Reitinger",
    };
    

    Hier würde ich statt kunde[] besser kunde[ANZ_KUND] verwenden. Wobei man ja ANZ_KUND per #define vorher festlegt. (Man braucht ANZ_KUND dann später ja nochmal im Programm!)

    eingabe = (char *)malloc(sizeof(char));
    

    Oha... nur 1 Zeichen für die Eingabe? 😉

    Besser so:

    eingabe = (char *) malloc(SIZE * sizeof(char));
    

    Wobei SIZE wieder per #define als ein best. Wert definiert ist.

    fgets(eingabe, strlen(eingabe), stdin);
    

    Oh je!!! 😞

    Hier strlen(eingabe) zu machen und als Buffergröße zu übergeben ist <zensiert>.
    (Was ist denn Deiner Meinung nach der Inhalt von eingabe, wenn noch gar nichts eingegeben wurde?!)

    "Besser" also:

    fgets(eingabe, SIZE, stdin);
    

    Nun hat man aber noch das Problem, dass eingae dann u.U ein Newline (\n) enthält! (In der Regel wird das so sein, falls das eingabe-Feld groß genug ist.) Man muss das also noch irgendwie entfernen, wenn man nacher den eingegebenen Namen mit den Kundennamen vergleichen will! (Sonst wird ja keine Übereinstimmung gefunden.) Ich mache das z. B. so: strtok(eingabe, "\n");

    for (i = 0; i < 5; i++)
    

    Eben, hier dann besser:

    for (i = 0; i < ANZ_KUND; i++)
    

    Nun willst Du vergleichen:

    if (eingabe == kunde[i].nachname)
    

    Auf diese Weise werden aber nur die Adressen der ersten beiden Elemente der Strings eingabe und kunde[ i ].nachname verglichen!

    Daher "besser" so:

    if (!strcmp(eingabe, kunde[i].nachname))
    

    Die Schleife tut dann aber auch nicht, was Du willst, weil Du nach einem Fund nicht abbrichst!

    for ...
    {
        if ...
        {
          printf("Diesen Mitarbeiter gibts in dieser Firma.\n");
        }
        else
        {
          printf("Keine Ausgabe !!");
        }
    }
    

    daher hier vielleicht besser so:

    for (i = 0; i < ANZ_KUND; i++)
    	{
    		if (!strcmp(eingabe, kunde[i].nachname))
    		{
    			printf("Diesen Mitarbeiter gibts in dieser Firma.\n");
    			found = 1;
    			break;
    		}
    	}
    
    	if (!found)
    	{
    		printf("Nicht gefunden!");
    	}
    

    (Man merkt: Ich arbeite gern mit "Flags" 🙂 - Das kann man natürlich bestimmt auch anders lösen).

    Am Ende würde sich also folgendes Programm ergeben. (Für Korrekturen und Verbesserungsvorschläge bin ich dankbar):

    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    #include <conio.h>
    
    #define SIZE 16
    #define ANZ_KUND 6
    
    typedef struct {
    	char *nachname;
    } KUNDENDATEN;
    
    KUNDENDATEN kunde[ANZ_KUND] = {
    								"Gilbert",
    								"Thieme",
    								"Keufen",
    								"Vlach",
    								"Holler",
    								"Reitinger"
    						  	  };
    
    int main(int argc, char* argv[])
    {
    	char *eingabe;
    	int i, found = 0;
    
    	printf("Eingabe Kundennamen: ");
    
    	eingabe = (char *) malloc(SIZE * sizeof(char));
    
    	fgets(eingabe, SIZE, stdin);
    	strtok(eingabe, "\n");
    
    	for (i = 0; i < ANZ_KUND; i++)
    	{
    		if (!strcmp(eingabe, kunde[i].nachname))
    		{
    			printf("Diesen Mitarbeiter gibts in dieser Firma.\n");
    			found = 1;
    			break;
    		}
    	}
    
    	if (!found)
    	{
    		printf("Nicht gefunden!");
    	}
    
    	getch();
    	return 0;
    }
    


  • EinGast schrieb:

    Am Ende würde sich also folgendes Programm ergeben. (Für Korrekturen und Verbesserungsvorschläge bin ich dankbar)

    Ooops. Ja...

    free(eingabe);
    

    sollte man natürlich vor dem Programmende auch nicht vergessen. Aber wie ein Vorredner schon erwähnt hat, ein einfaches

    char eingabe[SIZE];
    

    statt Allozierung mit malloc würd's [hier] auch tun.


Anmelden zum Antworten