In C eine Struktur schreiben



  • ^größer gleich 20 funktioniert trotzdem...
    mein problem ist gerade eher, angenommen ich möchte einen zweiten studenten eingeben und das in einer tabelle ausgeben wie mache ich das, dass das programm den ersten studenten in ein feld und den zweiten studenten in ein feld schreibt bzuw und noch weitere. Ich weiß das ich zb i++ also hochzählen lassen muss aber wie bzw wo gebe ich das feld [i] ein bei scanf?



  • Rickytop schrieb:

    ^größer gleich 20 funktioniert trotzdem...

    nur weil es nicht sofort kracht(programmabsturz), heißt es noch lange nicht, dass alles okay ist.
    bei >= 20 zeichen ist dein stack schon mal kaputt.

    Rickytop schrieb:

    mein problem ist gerade eher, angenommen ich möchte einen zweiten studenten eingeben und das in einer tabelle ausgeben wie mache ich das, dass das programm den ersten studenten in ein feld und den zweiten studenten in ein feld schreibt

    das einfachste ist ein array von strukturen.



  • @ cler:
    danke für den hinweis,leider darf ich aber an der struktur nichts verändern und ich weiß nicht wie ich das sonst einbauen sollte. wenn ich mir arrays bilden dürfte wie ich will, wäre es einfacher. aber ich darf ja nach der aufgaben stellung nicht verändern es muss also

    struct Student      //Deklaration der Struktur erfolgt global
    {
        int matnr;
        char* name;
    };
    typedef struct Student StudiTyp;
    

    bleiben!

    es kann eig nicht schwer und auch nicht viel sein, sonst wre das keine klausuraufgabe, dann hätten wir keine zeit für andere aufgaben.
    ich versteh es nur nicht was ich genau wo ändern muss...ich bin ein noob in dem bereich also nehmt mich bitte an die hand und helft mir 😃

    mittlerweile ist mein code so:

    #include <stdio.h>
    #include <stdlib.h>	//Für Funktion malloc
    #include <conio.h>
    
    struct Student      //Deklaration der Struktur erfolgt global
    {
        int matnr;
        char* name;
    };
    typedef struct Student StudiTyp;        //typedef vergibt den neuen Namen StudiTyp, dadurch muss struct nicht mehr angegeben werden
    
    void student_eingeben(StudiTyp *[20]);		//Deklaration des Funktionsprototyp mit Pointer(Zeiger) auf die Struktur
    
    StudiTyp ausgabe;		//Variable "ausgabe" wird vom Typ Struktur(StudiTyp) definiert
    
    int i=0,anfang;
    
     int main(void)      //Hauptprogramm
    {
    
    	do
    	{
    		student_eingeben(&ausgabe); //Einsatz der Funktion als Baustein(Rückgabetyp wie void ist hier überflüssig)
    
    		printf("\nFuer die Eingabe eines weiteren Studenten druecken Sie 'j': ");
    	}while (getche() == 'j');
    
    	printf("\nKontrolle der Eingabe: \n");
        printf("\nMatrikelnummer: %i\n", ausgabe.matnr);
        printf("Name: \t\t%s\n", ausgabe.name);
    
    	printf("\n|Lfd.|Name---------------|Matrikelnummer-----|\n");		//Ausgabe des Tabellenkopfes (%-19s heist nur linksbündig)
    	printf("|----|-------------------|-------------------|\n");
    	for (anfang=1; i>=anfang; anfang++)		//for schleife zur Erstellung der Liste anhand der eingegebenen einträge
    		{
    			printf("|%4i|%-19s|%-19i|",anfang, ausgabe.name, ausgabe.matnr);
    			printf("\n|----|-------------------|-------------------|\n");
    		}
    	free(ausgabe.name);		//Speicherbereich wieder freigeben
     }
    
    void student_eingeben(StudiTyp * eingabe[20])	//Von der Funktion wird die Adresse eingabe entgegengenommen, sie dient als Pointer auf die Struktur(StudiTyp)
    {
    		(*eingabe)[i].name=(char*)malloc(20*sizeof(char));		//Reservierung des Speicher für den Namen, bei Matnr wird dies nicht benötig da es kein Zeiger ist und somit Speicher besitzt
    		printf("\nBitte geben Sie die Matrikelnummer ein: ");
            scanf("%i", &(*eingabe)[i].matnr);						//Der &-Operator muss hier verwendet werden damit die Nummer und nicht die Adresse ausgegeben wird
    		printf("\nBitte geben Sie den Namen ein: ");
            scanf("%s", (*eingabe)[i].name);		//Man könnte auch "eingabe->name" statt "(*eingabe)name)" schreiben
    											//Die Klammern sind wichtig, weil der Punktoperator eine höhere Priorität hat als der Sternoperator
    		i++;
    }
    

    An dieser stelle zeigt der mir ein fehler bei dem bretzeloperator und ich weiß nicht wieso und wie ich das verlinken muss:

    student_eingeben(&ausgabe);
    


  • Rickytop schrieb:

    @ cler:
    danke für den hinweis,leider darf ich aber an der struktur nichts verändern und ich weiß nicht wie ich das sonst einbauen sollte. wenn ich mir arrays bilden dürfte wie ich will, wäre es einfacher. aber ich darf ja nach der aufgaben stellung nicht verändern es muss also

    struct Student      //Deklaration der Struktur erfolgt global
    {
        int matnr;
        char* name;
    };
    typedef struct Student StudiTyp;
    

    bleiben!

    da stimme ich dir voll und ganz zu, dass es einfacher wäre, ich meine aber mit einem array von strukturen so etwas:

    StudiTyp studis[40];
    


  • achso meinst du das...mom ich bastel mal 😃



  • der zeigt mir immernoch bei student_eingeben(&ausgabe) in der main ein fehler beim &-Operator. wie behebe ich das?



  • lies doch mal, was der fehler bedeutet ... 😉
    du müsstest in deiner do while schleife auch nen index oder sowas mitlaufen lassen.
    ich muss mich jetzt verpieseln, hab dir mal nen ansatz getippt, kriegste schon hin.
    wenn er bei malloc meckert, kompilierst du im c++ modus und musst casten oder auf c umstellen.
    gutes gelingen, bye.

    #define NAMELEN_MAX 63
    #define STUDENTEN_MAX 10000
    
    typedef struct tagStudent
    {
        int matnr;
        char* name;
    } Student;
    
    void student_anzeige ( Student* p, size_t n )
    {
    	size_t i;
    	for ( i = 0; i < n; i++ )
    		printf ("%d %s\n", p[i].matnr, p[i].name);
    }
    
    size_t student_eingabe ( Student* p, size_t n )
    {
    	size_t i = 0;
    	char eingabe[80*25];
    	char name[NAMELEN_MAX+1];
    	int matnr;
    
    	puts("Martielnummer und Namen eingeben, beenden mit Entertaste");
    	while ( i < n )
    	{
    		fgets(eingabe, sizeof(eingabe), stdin);
    		if ( eingabe[0] == '\n' )
    		{
    			break; // beendet durch benutzer
    		}
    		else if (2 != sscanf ( eingabe, "%d %63s", &matnr, name))
    		{
    			puts("Eingabefehler!");
    			continue;
    		}
    		else
    		{
    
    			p[i].name = malloc (strlen(name + 1));
    			if ( NULL != p[i].name )
    			{
    				p[i].matnr = matnr;
    				// ... strcpy benutzen, kriegste schon hin ...
    				i++;
    			}
    			else
    			{
    				// fehlerbehandlung ...
    				break;
    			}
    		}
    	}
    	return i; // anzahl eingegebener studenten
    }
    int main(void)
    {
        Student studenten[STUDENTEN_MAX];
    	size_t n = student_eingabe(studenten, STUDENTEN_MAX);
    	student_anzeige(studenten, n);
        return 0;
    }
    


  • danke dir aber glaube damit kann ich noch weniger anfangen 😃
    Denn leider habe ich vergessen zu erwähnen, dass wir kein string.h und die dazugehörigen funktionen wie strlen,strcpy benutzen dürfen. das macht es ja für mich ungemein schwer...erst darf ich keine arrays bilden wie ich mag und dann die einfachen string funktionen auch nicht nutzen...

    Mein problem bleibt soviel stehen, was meint visual studio damit wenn es an der &ausgabe sagt: Konvertierung des Parameters 1 von 'StudiTyp (*)[20]' in 'StudiTyp *[]' nicht möglich

    Ich verstehe es ja leider nicht und kann mir deshalb nicht helfen...



  • schreib dir doch deine eigene strlen und strcpy funktion, das sind wenige zeilen.
    dein compiler will dir mitteilen, dass die zeiger nicht kompatibel sind.



  • ja das könnte ich tun aber ich möchte wissen wieso der fehler dort ist bzw wie ich diesen fehler an dem Bretzeloperator behebe, sonst läuft mein programm und wirft mir ein student auch in tabellen form durch die printf anweisung aus...
    Kann mir nicht einer an von euch einfach nur sagen was ich an dieser stelle ändern muss damit die arrays von ausgabe richtig abgespeichert werden bzw wie ich das hinbekomme das die zeiger kompatiel werden??



  • du hast doch vom cler code gepostet bekommen. da wird auch ein zeiger als parameter übergeben, brauchste doch nur abschreiben. 🙄



  • sorry, aber ich bin zu blind um es zu erkennen...
    man hätte ja auch einfach schreiben können an welcher stelle ich mein code wie ändern muss...



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • C++ Forumbot schrieb:

    Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.

    Martin hätte den Thread wohl besser gleich in das C-Forum verschieben sollen.
    Da liegen auch die beiden anderen: http://www.c-plusplus.net/forum/298882, http://www.c-plusplus.net/forum/259783



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Rickytop schrieb:

    Hallo Liebes C Forum,

    ...
    b) Schreiben Sie die Struktur in eine Klasse um und ergänzen Sie diese mit der Funktion student_eingeben()

    Du bist falsch hier, in C gibt es keine Klassen, deine Aufgabenstellung ist also in C prinzipiell nicht realisierbar.


Anmelden zum Antworten