Ausgabe einer Zeichenkette über Zeiger



  • Hallo Profis,

    ich habe eine Aufgabe, an der ich jetzt schon einige Stunden knabber...

    Das Programm soll den Geburtstag in dd/mm/yyyy und den Namen einlesen und dann einfach wieder ausgeben. Klingt einfach. Ich soll es jedoch über einen Verbund machen. Die Ausgabe soll nur über Zeiger gehen. Mein Code sieht wie folgt aus:

    #include <stdio.h>
    
    /*Deklariere Dateityp TPerson*/
    
    typedef struct {
    	int dd, mm, yyyy;
    	char name[15];
    } TPerson;
    
    /* Beginn Hauptprogramm*/
    void main ( void ) {
    
    	/*Innere Variablendeklaration*/
    	TPerson ego;
    
    	/*Eingabe des Geburtstags und Zuweisung*/
    	do {
    		printf("Bitte geben Sie Ihen Geburtstag an: ");
    		scanf("%i", & ego.dd);
    	} while (ego.dd > 31 || ego.dd < 0);
    
    	/*Eingabe des Geburtsmonats und Zuweisung*/
    	do {
    		printf("Bitte geben Sie Ihren Geburtsmonat an: ");
    		scanf("%i", & ego.mm);
    	} while (ego.dd < 0 || ego.mm > 12);
    
    	do {
    		printf ("Bitte geben Sie Ihr Geburtsjahr ein: ");
    		scanf("%i", & ego.yyyy);
    	} while (ego.yyyy < 0);
    
    	printf ("Bitte geben Sie Ihren Vornamen an: ");
    	scanf ("\n%c",& ego.name);
    
    	/*Deklaration eines TPerson-Zeigers .*/
    	TPerson * p;
    
    	/*Setze Zeiger auf Adresse von ego*/
    	p = & ego;
    
    	printf("Danke, %c\n", *p -> name);
    	printf("Ihr Geburtsdatum ist %2i.%2i.%4i",  p -> dd, p -> mm, p -> yyyy);
    }
    

    Ich gebe 22; 2; 1992; Karl ein und bekomme als Ausgabe folgendes:

    "Danke, K
    Ihr Gebrtsdatum ist 22. 2.1992"

    Ich habe das Problem schon verstanden, dass der Pointer *p -> name nur auf das erste Zeichen des char arrays zeigt. Wie kann ich denn jetzt hier den kompletten Namen ausgeben? Ich weiß, dass ich max. 15 Zeichen zulassen darf und kenne somit die Länge des "Strings".

    Bin leider noch blutiger Anfänger, was man an den Übungsaufgaben sieht. Also, wenn ich noch mehr falsch gemacht habe, bin ich für jeden Hinweis dankbar.

    Ach ja. Ich MUSS in C Programmieren, also C++ ist tabut. Und auch der Lösungsweg über die Zeigerausgabe und Verbundvariablen ist mir vorgegeben.

    Vielen Dank,
    Jan :xmas1:



  • CJens schrieb:

    Hallo Profis,

    ich habe eine Aufgabe, an der ich jetzt schon einige Stunden knabber...

    Das Programm soll den Geburtstag in dd/mm/yyyy und den Namen einlesen und dann einfach wieder ausgeben. Klingt einfach. Ich soll es jedoch über einen Verbund machen. Die Ausgabe soll nur über Zeiger gehen. Mein Code sieht wie folgt aus:

    #include <stdio.h>
    
    /*Deklariere Dateityp TPerson*/
    
    typedef struct {
    	int dd, mm, yyyy;
    	char name[15];
    } TPerson;
    
    /* Beginn Hauptprogramm*/
    void main ( void ) {
    
    	/*Innere Variablendeklaration*/
    	TPerson ego;
    
    	/*Eingabe des Geburtstags und Zuweisung*/
    	do {
    		printf("Bitte geben Sie Ihen Geburtstag an: ");
    		scanf("%i", & ego.dd);
    	} while (ego.dd > 31 || ego.dd < 0);
    
    	/*Eingabe des Geburtsmonats und Zuweisung*/
    	do {
    		printf("Bitte geben Sie Ihren Geburtsmonat an: ");
    		scanf("%i", & ego.mm);
    	} while (ego.dd < 0 || ego.mm > 12);
    
    	do {
    		printf ("Bitte geben Sie Ihr Geburtsjahr ein: ");
    		scanf("%i", & ego.yyyy);
    	} while (ego.yyyy < 0);
    
    	printf ("Bitte geben Sie Ihren Vornamen an: ");
    	scanf ("\n%c",& ego.name);
    
    	/*Deklaration eines TPerson-Zeigers .*/
    	TPerson * p;
    
    	/*Setze Zeiger auf Adresse von ego*/
    	p = & ego;
    
    	printf("Danke, %c\n", *p -> name);
    	printf("Ihr Geburtsdatum ist %2i.%2i.%4i",  p -> dd, p -> mm, p -> yyyy);
    }
    

    Ich gebe 22; 2; 1992; Karl ein und bekomme als Ausgabe folgendes:

    "Danke, K
    Ihr Gebrtsdatum ist 22. 2.1992"

    Ich habe das Problem schon verstanden, dass der Pointer *p -> name nur auf das erste Zeichen des char arrays zeigt. Wie kann ich denn jetzt hier den kompletten Namen ausgeben? Ich weiß, dass ich max. 15 Zeichen zulassen darf und kenne somit die Länge des "Strings".

    Bin leider noch blutiger Anfänger, was man an den Übungsaufgaben sieht. Also, wenn ich noch mehr falsch gemacht habe, bin ich für jeden Hinweis dankbar.

    Ach ja. Ich MUSS in C Programmieren, also C++ ist tabut. Und auch der Lösungsweg über die Zeigerausgabe und Verbundvariablen ist mir vorgegeben.

    Vielen Dank,
    Jan :xmas1:

    Danke dass Du C/C++ tags nutzt 😃



  • Beim schnellen durchlesen fällt auf dass du in Zeile 34 den Adressoperator entfernen solltest, ausserdem möchtest Du einen string einlesen also nutze %s und nicht %c 😉



  • ...hab ich eig. verscht. Das

    und
    

    siehst Du ja noch vor und nach dem Code. Was hab ich falsch gemacht?



  • CJens schrieb:

    ...hab ich eig. verscht. Das

    und
    

    siehst Du ja noch vor und nach dem Code. Was hab ich falsch gemacht?

    Hm.. stimmt.. keine Ahnung 😃

    Naja aber wie gesagt die Antwort auf den problem ist dass "%c" eben nur ein Zeichen und keine Zeichenkette einliest. :xmas1:



  • Danke 🙂
    Jetzt funktioniert es *Juhu*

    Und dafür hab ich jetzt drei Stunden gebracht... ich hoffe, es ist am Anfang normal 😉

    Schönen Abend und bis zum Nächste mal.



  • ...aber so viele Cookies gibts in dem Frame auch nicht 😃



  • Ach ja, abgesehen davon, auch wenn Du noch Anfänger bist:

    - Es heist int main() oder int main(int argc, char *argv[]) aber niemals void main
    - Beim einlesen eines strings mittels scanf() sollte, nein, muss man die maximale Anzahl an Zeichen beschränken:

    char buffer[16];
    scanf("%15s", buffer);
    

    Bin mir jetzt auch nicht ganz sicher ob scanf() das letzte Zeichen automatisch 0 setzt.. vielleicht weis das ja jemand.



  • cooky451 schrieb:

    Bin mir jetzt auch nicht ganz sicher ob scanf() das letzte Zeichen automatisch 0 setzt.. vielleicht weis das ja jemand.

    1. Warum nicht?
    2. Warum probierst du es nicht?



  • Zum einlesen von Strings lieber fgets verwenden...



  • wxSkip schrieb:

    2. Warum probierst du es nicht?

    Weil probieren doof ist. Nachher ist das von der Implementation abhängig und du suchst dir einen Wolf, weil auf einer anderen Maschine der Code, der schon mal funktioniert hat, nicht mehr funktioniert.

    wxSkip schrieb:

    1. Warum nicht?

    Wobei ich mir nicht sicher bin, ob die abschließende 0 nicht Teil des Strings ist? Wäre annehmbar. Klärt aber immer noch nicht die Frage. Weil wenn der String länger ist, liegt die Null ausserhalb des Bereichs und muss wieder von der Funktion gesetzt werden.



  • Na dann schaun' mer mal 😉 .

    http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

    Hier steht's zwar nicht explizit drin, aber das Beispiel verwendet scanf() so und das sollte doch korrekt sein.


Anmelden zum Antworten