Probleme mit Strukturen und Strings/Arrays



  • Hallo,

    Habe hier folgendes Programm in C.
    Habe eine Struktur Gamestat und eine Struktur Scores.
    Problem ist das sich das Programm immer bei

    printf("\nGib den Score des %i. Spielers ein: ", x);
                    scanf("%i", games[i].highscores[x].score);
    

    aufhängt. highscores ist ja ein Array mit 10 so dingern (fällt grad nich ein wie man das nennt 🙂 ) naja jedenfalls finde ich den fehler nicht. Bisher funktiert (oder auch nicht) nur der Menüpunkt 1, Titel, Hersteller, Zugriffe, Alias kann ich ohne Probleme eingeben.
    Da fällt mir ein:

    //scanf("%s", games[0].titel);
    //scanf("%s", games->titel);
    

    Wo genau ist denn hier der Unterschied? Warum beim Array der "." und wenn ich nur Games schreibe ein "->". games bleibt ja ein Array und beim ersten schreibt er es in index 0 rein, wo aber schreibt er es beim zweiten hinein?.

    void menu(void);
    int auswahl(int);
    
    struct scores
    {
    	char	alias[9];
    	unsigned	int	score;
    };
    
    struct Gamestat
    {
    	char	titel[31];
    	char	hersteller[21];
    	int		Zugriffe;
    	struct	scores	highscores[10];
    };
    
    struct Gamestat	games[100];
    
    void menu(void)
    {
    	printf("\n1: Neue Spieldaten eingeben:	");
    	printf("\n2: Spieldaten bearbeiten:		");
    	printf("\n3: Spieldaten loeschen:		");
    	printf("\n4: Spieldaten anzeigen:		");
    }
    
    int auswahl(int anummer)
    {
    	switch(anummer)
    	{
    	case 1:
    		{
    			int i = 0;
    			int x = 0;
    			//system_cls;
    			printf("\nBitte Spieler nummer angeben: ");
    			scanf("%i", &i);
    
    			printf("\nTitel des Spiels? ");
    			scanf("%s", games[i].titel);
    
    			printf("\nHersteller des Spiels? ");
    			scanf("%s", games[i].hersteller);
    
    			printf("\nAnzahl der Zugriffe? ");
    			scanf("%i", &games[i].Zugriffe);
    
    			for(x; x < 10; x++)
    			{
    				printf("\nAlias des %i. Spielers eingeben: ", x);
    				scanf("%s", games[i].highscores[x].alias);
    
    				printf("\nGib den Score des %i. Spielers ein: ", x);
    				scanf("%i", games[i].highscores[x].score);
    			}
    		}
    	case 2:
    		{
    			break;
    		}
    	case 3:
    		{
    			/*int y = 0;
    
    			printf("Welche nummer möchten Sie löschen? ");
    			scanf("%i", &y);
    
    			struct Gamestat games[y] =
    			{
    				"kein Titel",
    				"kein Hersteller",
    				0,
    			};*/
    			break;
    	case 4:
    		{
    			/*int z = 0;
    			int t = 0;
    
    			printf("\nWelche Spieldaten wollen Sie anzeigen lassen? ");
    			scanf("%i", &z);
    
    			printf("\nTitel:		%s", games[z].titel);
    			printf("\nHersteller:	%s", games[z].hersteller);
    			printf("\nZugriffe:		%i", games[z].Zugriffe);
    			for(t; t < 10; t++)
    			{
    				printf("\nAlias:		%s", games[z].highscores[t].alias);
    				printf("\nScore:		%i", games[z].highscores[t].score);*/
    			}
    		}
    
    		}
    	default:
    		break;
    	}
    
    }
    
    int main(void)
    {
    	//printf("Bitte geben Sie den Titel des Spiels ein: ");
    	//scanf("%s", games[0].titel);
    
    	int mnummer = 0;
    
    	menu();
    
    	printf("\nWas wollten Sie tun? ");
    	scanf("%i", &mnummer);
    
    	auswahl(mnummer);
    
    	return 0;
    }
    

    ---------------------------------------------------------------------------------
    So damit ich nicht noch ein zweiten Thread aufmachen muss noch ein Problemchen von mir 🙂

    #include <stdio.h>
    
    void clean_telnr(char *);
    
    void clean_telnr(char * telenr)
    {
    	char hilfstr[16];
    	char * hPtr;
    	hPtr = &hilfstr;
    	do
    	{
    
    		if(*telenr == 1)	//('1' || '2' || '3' || '4' || '5' || '6' || '7' || '8' || '9' || '0'))
    		{
    			*hPtr = *telenr;
    			*telenr++;
    			*hPtr++;
    		}
    		else
    		{
    			*telenr++;
    		}
    
    	}while(*telenr != '\0');
    
    	printf("\n Die Nummer ohne Zeichen lautet: %s", *hPtr);
    }
    
    int main(void)
    {
    	char telnr[16];
    	char *tPtr;
    	tPtr = &telnr;
    
    	printf("\nBitte Telefonnummer eingeben: ");
    	gets(telnr);
    
    	clean_telnr(*tPtr);	
    
    	return 0;
    }
    

    Programm soll eine Telefonnummer (Beispiel: 934234-432343/4003) ein einen String /Array einlesen und die Funktion soll alle Zeichen entfernen und die Telefonnummer, jetzt nur noch bestehend aus Ziffern ausgeben. ist eine alte Prüfungsaufgabe.
    Das Programm hängt sich immer bei der If- abfrage auf. glaube sowieso das ich das zu umständlich gemacht hab.

    Vielen Dank für die Hilfe im vorraus 😃



  • mazeli schrieb:

    Hallo,

    Habe hier folgendes Programm in C.
    Habe eine Struktur Gamestat und eine Struktur Scores.
    Problem ist das sich das Programm immer bei

    printf("\nGib den Score des %i. Spielers ein: ", x);
                    scanf("%i", games[i].highscores[x].score);
    

    aufhängt. highscores ist ja ein Array mit 10 so dingern (fällt grad nich ein wie man das nennt 🙂 ) naja jedenfalls finde ich den fehler nicht. Bisher funktiert (oder auch nicht) nur der Menüpunkt 1, Titel, Hersteller, Zugriffe, Alias kann ich ohne Probleme eingeben.

    Hast du womöglich den Namen vorher mit Leerzeichen oder mit mehr als 8 Buchstaben eingegeben? Dadurch kommt die ganze Eingabe schnell durcheinander.

    Da fällt mir ein:

    //scanf("%s", games[0].titel);
    //scanf("%s", games->titel);
    

    Wo genau ist denn hier der Unterschied? Warum beim Array der "." und wenn ich nur Games schreibe ein "->". games bleibt ja ein Array und beim ersten schreibt er es in index 0 rein, wo aber schreibt er es beim zweiten hinein?.

    Arrays können in C auch als Pointer auf das erste (nullte) Element interpretiert werden. Von daher sind die beiden Befehle gleichwertig ("games[0]" ist das erste Element, deshalb mußt du mit . auf seine Member zugreifen, "games" ist ein Zeiger auf das erste Element, deshalb brauchst du -> für den Zugriff).

    So damit ich nicht noch ein zweiten Thread aufmachen muss noch ein Problemchen von mir 🙂

    #include <stdio.h>
    
    void clean_telnr(char *);
    
    void clean_telnr(char * telenr)
    {
    	char hilfstr[16];
    	char * hPtr;
    	hPtr = &hilfstr;
    	do
    	{
    		
    		if(*telenr == 1)	//('1' || '2' || '3' || '4' || '5' || '6' || '7' || '8' || '9' || '0'))
    		{
    			*hPtr = *telenr;
    			*telenr++;
    			*hPtr++;
    		}
    		else
    		{
    			*telenr++;
    		}
    
    	}while(*telenr != '\0');
    
    	printf("\n Die Nummer ohne Zeichen lautet: %s", *hPtr);
    }
    
    int main(void)
    {
    	char telnr[16];
    	char *tPtr;
    	tPtr = &telnr;
    
    	printf("\nBitte Telefonnummer eingeben: ");
    	gets(telnr);
    
    	clean_telnr(*tPtr);	
    	
    	return 0;
    }
    

    Programm soll eine Telefonnummer (Beispiel: 934234-432343/4003) ein einen String /Array einlesen und die Funktion soll alle Zeichen entfernen und die Telefonnummer, jetzt nur noch bestehend aus Ziffern ausgeben. ist eine alte Prüfungsaufgabe.
    Das Programm hängt sich immer bei der If- abfrage auf. glaube sowieso das ich das zu umständlich gemacht hab.

    Vielen Dank für die Hilfe im v****** 😃

    Erstens hat die Ziffer '1' als ASCII-Zeichen nicht den Wert 1, sondern 49 - ASCII 1 ist ein nicht darstellbares Sonderzeichen. Und zweitens solltest du mal man: isdigit versuchen.

    PS: Das C Board ist eine Etage höher 😉



  • mazeli schrieb:

    printf("\nGib den Score des %i. Spielers ein: ", x);
                    scanf("%i", games[i].highscores[x].score);
    

    Schreib mal ein & vor den Wert, in den du mit scanf den Punktwert einlesen möchtest. scanf möchte einen Zeiger.

    mazeli schrieb:

    if(*telenr == 1)
    

    Wenn du prüfen möchtest, welche Ziffer in dem Array steht, kannst du nicht auf ==1 (oder ==2, ==3, usw.) prüfen, da du ein char-Array hast. Du musst auf den ASCII Wert der Ziffer prüfen.

    BTW: Was du hier schreibst ist C und kein C++. Also falsches Forum.



  • Ups, sorry hab doch glatt das C Forum übersehn, naja vielleicht kann ein Mod es ja verschieben 🙂

    jetzt noch ne dumme Frage, wie Prüfe ich denn auf den ASCII Code? 🙂



  • Am einfachsten, indem du den Wert in Anführungszeichen setzt ('1' ist das ASCII-Zeichen 1), alternativ kannst du dir auch die entsprechenden Werte heraussuchen (Ziffern liegen zwischen 48 ('0') und 57 ('9')) oder die Zeichenklassifikation mit isdigit() verwenden.



  • Also er stürzt immer noch ab, selbst bei isdigit, kann isdigit überhaupt was mit dem char Array anfangen? so wie ich das verstanden hab funktioniert das nur mit Integer?

    Hab mal en screenshot gemacht

    http://img136.imageshack.us/img136/149/fehler0wu.th.jpg



  • mazeli schrieb:

    Also er stürzt immer noch ab, selbst bei isdigit, kann isdigit überhaupt was mit dem char Array anfangen?

    Nein. Deswegen stürzt er ab. Musst der Funktion wohl der übel jedes Zeichen einzeln übergeben. Aber das willst du ja sowieso machen, um die Zeichen rauszufiltern, die keine Zahl sind.



  • So das mit dem "&" bei dem anderen Programm hat nicht funktioniert, stürzt nach wie vor ab 😞


Anmelden zum Antworten