[gelöst] Frage zu kl. C-Prog mit Zeigern

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

[gelöst] Frage zu kl. C-Prog mit Zeigern

Beitrag von Duff » 05.11.2009 20:02:33

Hallo,

bin dabei mir C anzueignen und scheitere gerade an folgendem (einfachen) Beispiel mit Zeigern.

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 255

char *eingabe(char *str) {
	char input[MAX];

	printf("Bitte \"%s\" eingeben: ",str);
	fgets(input, MAX, stdin);
	return strtok(input,"\n");
}

int main(void) {
	char *ptr;

	ptr=eingabe("Vorname");
	printf("Hallo %s\n",ptr);
	ptr=eingabe("Nachname");
	printf("%s, interessanter Nachname\n", ptr);

	return 0;
}
Bei der Ausgabe wird bei mir nur folgender Zeichensalat ausgegeben:

Code: Alles auswählen

Bitte "Vorname" eingeben: Vor
Hallo �@
Bitte "Nachname" eingeben: Nach
�@, interessanter Nachname
Danke.
Zuletzt geändert von Duff am 05.11.2009 20:24:33, insgesamt 1-mal geändert.
Oh, yeah!

Benutzeravatar
schorsch_76
Beiträge: 2612
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Frage zu kl. C-Prog mit Zeigern

Beitrag von schorsch_76 » 05.11.2009 20:10:38

Du musst das so machen:

Code: Alles auswählen

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 255

   char input[MAX];

char *eingabe(char *str) {

   printf("Bitte \"%s\" eingeben: ",str);
   fgets(input, MAX, stdin);
   return strtok(input,"\n");
}

int main(void) {
   char *ptr;

   ptr=eingabe("Vorname");
   printf("Hallo %s\n",ptr);
   ptr=eingabe("Nachname");
   printf("%s, interessanter Nachname\n", ptr);

   return 0;
}

Das char array input ist bei der ausgabe nicht mehr existent. Da es eine lokale Variable war/ist.

EDIT: Tipp: Objectlifetime beachten. Der Pointer zeigt noch auf die "alte Stelle" auf dem Stack, welcher natürlich beim verlassen der Funktion verändert wird. Das ist übrigens ncht so toll, da das übliche Stellen sind, an denen man Code einschleisen kann. Stackmanipulation. Desweiteren kann man wenn man mehr als MAX Zeichen angibt, das Arrayende überschreiben. Bööse. Crash. ;)

EDIT2: Das mit dem "Mehr als MAX" zeichen geht ja nicht, da fgets ja nur MAX ZEichen akzeptiert.

Erst ganz Denken, dann schreiben. :?

Gruß

schorsch

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Frage zu kl. C-Prog mit Zeigern

Beitrag von Duff » 05.11.2009 20:24:09

Danke, so funktioniert es.

Muss mir das nochmals durch den Kopf gehen lassen, was du da zum Stack geschrieben hast.
Bin im Moment ein wenig verwirrt. Aber vielleicht ist es auch einfach zu spät und ich schaue mir die Sache morge nochmal an.


Oder kennst du noch eine gute Quelle, wo dies "verständlich" beschrieben wird?
Oh, yeah!

Benutzeravatar
schorsch_76
Beiträge: 2612
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst] Frage zu kl. C-Prog mit Zeigern

Beitrag von schorsch_76 » 05.11.2009 20:34:02

Kleine Erklärung:

char* ptr = ....

kann von hinten nach vorne gelesen werden: ptr ist ein pointer auf einen char.

Zu den Objektlebenszeiten:

Wenn du das Array char input[MAX] inner halb deiner Funktion anlegst, wird der Speicher dafür beim Betreten der Funktion auf dem Stack reserviert. Jede lokale Variable wird auf dem Stack erzeugt. Dieser SPeicher wird beim Verlassen der Funktion wieder freigegeben. Ein Pointer darauf kann natürlich nach "draussen" gehen, zeigt aber nach dem Ender der Funktion auf einen Bereich, der nicht mehr ein "gültiger" Speicherbereich ist.

Legst du die Variable in ausserhalb aller funktionen an, wird dieser Speicherbereich vor main reserviert und nach main wieder freigegeben. Deshalb Zeigt der ptr noch auf einen gültigen Speicherbereich.

Gute Seite im Netz kenne ich atm leider nicht. Ich empfehle dir ein Buch [1] ;) Persönlich programmiere ich eher in C++ als in C, da ich hier meiner Meinung nach mehr machen kann als in C (Templates, Klassen etc pp). C ist auch eine Untermenge von C++

Gruß

schorsch

[1] http://www.amazon.de/Die-Programmierspr ... 547&sr=8-2

EDIT: Grad gefunden: http://openbook.galileocomputing.de/c_von_a_bis_z/

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Frage zu kl. C-Prog mit Zeigern

Beitrag von Meillo » 05.11.2009 21:05:55

schorsch_76 hat geschrieben:EDIT2: Das mit dem "Mehr als MAX" zeichen geht ja nicht, da fgets ja nur MAX ZEichen akzeptiert.
MAX-1 um genau zu sein, da noch Platz für `\0' sein muss.
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: [gelöst] Frage zu kl. C-Prog mit Zeigern

Beitrag von Duff » 06.11.2009 07:31:28

Danke für die beiden Erklärungen.


PS: Das Buch C von A bis Z arbeite ich gerade durch...
Oh, yeah!

Antworten