Springerproblem



  • Dankeschön!
    Es hat geklappt:D

    int main(int argc, char *argv[])
    {
    	int i,summe=0,j=0;	
    	for(i=1; i<argc; i++)
    	{
    		j = strtol(argv[i],NULL,10);
    		summe = summe + j;
    	}
    	printf("Summe: %d\n",summe);
    return 0;
    }
    


  • Heyho,

    arbeite mich gerade in Strukturen und lineare Listen ein.
    Ist gerade etwas holprig.

    Also bearbeite gerade eine Aufgabe dazu:

    Gegeben ist folgende Struktur:

    struct Spieler
    {
    char *vorname;
    char *nachname;
    int tore;
    struct Spieler *next;
    };
    

    Hier die Frage dazu:

    Schreibe ein Funktion, die einen Datensatz am Anfang einer linearen Liste mit obiger Struktur
    einfügt. Die Eingabeparameter der Funktion sollen ein Zeiger auf Listenanfang und ein Zeiger
    auf das einzufügende Element sein. Die Funktion soll einen Zeiger auf den Listenanfang mit
    dem neuen Datensatz zurückgeben.

    1:
    Also in der Struktur, habe ich ja einen struct Spieler *next, der soll ja immer am Ende des jeweiligen Datensatzes stehen, dass sehe ich doch richtig und gleichzeitig am Ende auch = NULL?

    2:
    Was ich nicht direkt verstehe, was mit char *vorname gemeint ist, in der Struktur.
    Wenn ich jetzt eine Code schreibe(mit der Struktur), indem nach einem Vorname gefragt wird und dieser dann an die Fkt. "einfuegen" gegeben wird, dann bekomme ich einen Speicherzugriffsfehler.
    Mache das immer in kleinen Schritten, sonst stehen da 1000 Fehler und ich hab keine Ahnung woher die kommen.

    Also hier erst einmal der Code:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    struct Spieler{
    	char *vorname;
    	char *nachname;
    	int tore;
    	struct Spieler *next;
    };
    struct Spieler *anfang = NULL;
    
    void einfuegen(char *vn)
    {
    	if(anfang == NULL)
    	{
    		if((anfang = malloc(sizeof(struct Spieler))) == NULL){
    			printf("Kein Speicherplatz vorhanden!\n"); return;
    		}
    		strcpy(anfang->vorname,vn);
    // 		printf("%s\n",anfang->vorname);
    	}
    }
    
    int main()
    {
    	char vn[20];
    	printf("Vorname...: ");
    	fgets(vn,20,stdin);
    	einfuegen(vn);
    	return 0;
    }
    

    Wenn in der Struktur stehen würde "char vorname[zahl]", dann geht es, aber da es ein Pointer ist, kommt halt die Fehlermeldung.



  • ftfy

    #include <stdlib.h>
    #include <malloc.h>
    #include <stdio.h>
    #include <string.h>
    
    struct player
    {
        char *name;
        char *surname;
        int goals;
        struct player *next;
    };
    
    void append( struct player ** const players, char const * const name)
    {
        struct player *end = 0;
    
    	if( !*players )
        {
            *players = malloc( sizeof( **players ) );
    		memset( *players, 0, sizeof( **players ) );
    		end = *players;
    
    	} else {
    		for( end = *players; end->next; end = end->next )
    			;
    		end->next = malloc( sizeof( **players ) );
    		end = end->next;
    		memset( end, 0, sizeof( **players ) );
    	}
    
    	end->name = malloc( strlen( name ) + 1 );
    	strcpy( end->name, name );
    }
    
    int main()
    {
        struct player *players = 0;
    	struct player *i = 0;
    
    	char name[ 20 ];
    
    	for( ;; ) {
    		printf( "Name: " );
    		fgets( name, sizeof( name ), stdin );
    
    		if( strlen( name ) == 1 )
    			break;
    
    		append( &players, name );
    	}
    
    	for( i = players; i; i = i->next ) {
    		puts( i->name );
    	}
    }
    


  • Zu 1.:
    Nein, der Verweis muss nicht am Ende der struct stehen.
    Ich persönlich mache den am Anfang, da ich dann nur einmal eine Listenverwaltung schreiben muss. Die Zeiger stehen immer am Anfang, egal wie groß die struct ist.

    Zu 2.:
    Da es nur ein Pointer ist, fehlt erstmal der Speicher wo du die Daten hin kopieren kannst.
    Wenn du da ein Array mit fester Länge hast, verschenkst du Speicher oder er reicht nicht.

    Das if(anfang == NULL) brauchst du auch nicht.
    Deine Funktion soll auch "... einen Zeiger auf den Listenanfang mit
    dem neuen Datensatz zurückgeben."
    Das fehlt völlig.

    fgets speichert übrigens das '\n' am Ende mit ab.
    Kannst du feststellen wenn du sowas machst:

    printf("<%s>\n",anfang->vorname);
    

    Wenn da dann

    <Aknayirp>
    

    steht, ist kein '\n' drin.
    Bei

    <Aknayirp
    >
    

    steht, ist ein '\n' drin


Anmelden zum Antworten