Funktion Zeiger auf eine Zeichenkette |
Lycaner
Eroberer
Dabei seit: 17.02.2013
Beiträge: 56
|
|
Funktion Zeiger auf eine Zeichenkette |
|
Aufgabenstellung:
Schreiben Sie eine C-Funktion, die einen Zeiger auf eine Zeichenkette(Zeiger auf Typ char) als Parameter hat und das erste Zeichen dieser Zeichenkette als Funktionswert(Typ char) zurückgibt.
#include <stdio.h>
char xy( char *Zeiger[]);
int main (void) {
char Zeichenkette[100];
scanf("%s", Zeichenkette);
xy(*Zeiger);
printf(" Erster Buchstabe der Zeichenkette ist %c",xy(Zeiger));
return 0;
}
char xy( char *Zeiger[]){
char text[100];
char e;
*Zeiger[]=text[100];
e= text[0];
return e;
}
Und wenn einer meint, das ist totaler Sch***, was ich geschrieben habe, hat sicher recht, weil ich mit den Zeiger nicht zu recht komme(
Kann mir einer helfen und erklären, wie das mit Zieger genau funktioniert.
Ich habe zwei verschiedene Tutorien dazu gelesen. Es hat mir nur wenig gebracht.
|
|
19.02.2013 20:20 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
Hallo,
Dein Ansatz ist gar nicht so weit von der Lösung entfernt.
Fangen wir doch mal langsam an und schauen ob das dein Verständnis verbessert.
Du deklarierst Zeichenkette als char array. Welchen Typ hat dann Zeichenkette?
Tipp: Du musst dazu wissen, was in C ein Array ist.
VG,
Karlito
|
|
19.02.2013 21:00 |
|
|
Lycaner
Eroberer
Dabei seit: 17.02.2013
Beiträge: 56
|
|
Ich dachte " Zeiger []" ist meine Array
|
|
19.02.2013 21:07 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
Nein, eben nicht. Ein Array ist ein Speicherbereich und die Variable ist dann ein Zeiter auf das erste Element.
Wenn also Zeichenkette den Typ char * hat, was ist dann *Zeichenkette?
Edit: Achso, sorry, ich habe nicht richtig gelesen. Es ist ein Array... Das ist richtig. Trotzdem mal bitte die oben genannte Frage beantworten, wenn ich dich jetzt nicht vollends verwirrt habe.
Edit2: Verstehst du den Zusammenhang zwischen Array und Zeiger?
VG,
Karlito
|
|
19.02.2013 21:15 |
|
|
Lycaner
Eroberer
Dabei seit: 17.02.2013
Beiträge: 56
|
|
Zeiger zeigt auf eine Adresse und Array reserviert Speicherplatz
|
|
19.02.2013 21:41 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
Mh, das ist ein wenig schwierig.
An deinem Beispiel:
code: |
1:
2:
3:
|
char Zeichenkette[100];
|
|
Zeichenkette ist nun eine Variable. Diese hat den Typ (char *). Mit der Deklaration wird aber, wie du schon sagst Speicherplatz reserviert. Die Variable ist nun ein Zeiger auf diesen reservierten Speicherplatz.
Die Ausdrücke
code: |
1:
2:
3:
|
*Zeichenkette;
|
|
und
code: |
1:
2:
3:
|
Zeichenkette[0];
|
|
haben die selbe Bedeutung.
Soweit klar?
VG,
Karlito
|
|
19.02.2013 21:52 |
|
|
Lycaner
Eroberer
Dabei seit: 17.02.2013
Beiträge: 56
|
|
Wenn es gleich ist, wie kann man ein Zeiger auf eine Zeichenkette machen?
|
|
19.02.2013 21:59 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
Eine Zeichenkette ist in C eigentlich schon ein Zeiger... Das ist ja das geheimnis...
Du musst also an die Fkt xy nur Zeichenkette selbst übergeben...
Deine Funktion xy stimmt dann aber noch nicht. Wenn man weiß wie, dann ist es sehr einfach. Schon eine Idee?
VG.
Karlito
|
|
19.02.2013 22:18 |
|
|
Lycaner
Eroberer
Dabei seit: 17.02.2013
Beiträge: 56
|
|
Nein, ich habe alle Zeichenkette[] durch *Zeichenkette ersetzt, kein Schritt weiter gekommen. Ich rate mehr, als das ich weiß, was ich da machen soll(
|
|
19.02.2013 22:34 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
Das war der falsche Schluss... Deine main war fast richtig. Du musst nur an die Funktion xy Zeichenkette übergeben und nicht *Zeichenkette. Du brauchst auch xy nicht 2 mal aufrufen. Ich gebe dir mal die main vor:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
|
#include <stdio.h>
char xy( char *Zeiger[]);
int main (void) {
char Zeichenkette[100];
scanf("%s", Zeichenkette);
printf(" Erster Buchstabe der Zeichenkette ist %c",xy(Zeiger));
return 0;
}
|
|
Du musst jetzt nur noch die Funktion xy implementieren.
VG,
Karlito
|
|
19.02.2013 22:47 |
|
|
Lycaner
Eroberer
Dabei seit: 17.02.2013
Beiträge: 56
|
|
Tja, ich habe jetzt das geschrieben. Ist auch falsch.
char xy( char *Zeiger[100]){
char *e;
*e=*Zeiger[0];
return *e;
Wenn ich Zeiger [0] schreibe, damit nur der erster Zeichen von der Zeichenkette kommt, woher weist das Programm, dass ich nicht eine Zeichenkette mit 0Zeichen meine?
Und wenn *Zeiger und Zeiger[] gleich ist, ist *Zeiger[] nicht doppelt deklariert?
|
|
20.02.2013 12:55 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
Zitat: |
Original von Lycaner
Tja, ich habe jetzt das geschrieben. Ist auch falsch.
char xy( char *Zeiger[100]){
char *e;
*e=*Zeiger[0];
return *e;
|
Das ist ziemliches Kauderwelsch, aber auch meine Schuld. S.u.
Zitat: |
Original von Lycaner
Und wenn *Zeiger und Zeiger[] gleich ist, ist *Zeiger[] nicht doppelt deklariert? |
Du hast vollkommen recht. Da war ich etwas schlampig... Es müsste heißen:
code: |
1:
2:
3:
|
char xy( char *Zeiger);
|
|
Vielleicht ginge auch
code: |
1:
2:
3:
|
char xy( char Zeiger[]);
|
|
Das weiß ich nicht genau. Jedenfalls musst du im Anschluss nur das erste Element des "Arrays" zurückgeben. Eine neue Variable brauchst du dafür nicht. Den Funktionskopf musst Du dementsprechend auch anpassen.
Zitat: |
Original von Lycaner
Wenn ich Zeiger [0] schreibe, damit nur der erster Zeichen von der Zeichenkette kommt, woher weist das Programm, dass ich nicht eine Zeichenkette mit 0Zeichen meine?
|
Das weiß das Programm nicht. Das musst Du durch geeignete Prüfungen sicherstellen, bevor du die Funktion aufrufst.
Anmerkung: Leere Zeichenkette nicht mit uninitialisiert verwechseln. Sollte die Zeichenkette nur die Länge 0 haben, so wäre der Rückgabewert der Funktion schlichtweg 0, da Zeichenketten in C ja immer durch 0 bzw '\0' terminiert werden. Ist die Zeichenkette uninitialisiert erhältst du einen Zufälligen Wert... Das gilt es auf jeden Fall zu vermeiden. So wie die main momentan implementiert ist, kann die Zeichenkette ja aber nicht uninitialisiert sein.
VG,
Karlito
|
|
20.02.2013 13:49 |
|
|
Lycaner
Eroberer
Dabei seit: 17.02.2013
Beiträge: 56
|
|
char xy( char *Zeiger){
char e;
e=*Zeiger;
}
Wenn ich das, als Funktion eingebe, gibt er nur den Fehler im Hauptprogramm, dass er diese Funktion nicht kennt(
|
|
20.02.2013 14:31 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
Hallo.
ich weiß nicht genau wo dein Fehler ist... Die Variable Zeiger war in der Funktion main nicht bekannt. Noch ein Fehler der sich leider eingeschlichen hat... Das passiert wenn man nicht testet.
Um weitere Missverständnisse zu verhindern, hier die lauffähige Variante.
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
|
#include <stdio.h>
char xy( char *Zeiger);
int main (void) {
char Zeichenkette[100];
scanf("%s", Zeichenkette);
printf(" Erster Buchstabe der Zeichenkette ist %c\n",xy(Zeichenkette));
return 0;
}
char xy( char *Zeiger){
return Zeiger[0];
//return *Zeiger; //liefert das selbe
}
|
|
Sorry für die Umstände. Wenn etwas unklar ist, kannst du natürlich gern nachfragen.
VG,
Karlito
|
|
20.02.2013 14:38 |
|
|
Lycaner
Eroberer
Dabei seit: 17.02.2013
Beiträge: 56
|
|
Tja, jetzt bin ich etwas verwirrt, eigentlich macht die Funktion nichts und die gibt nur ein Zeichen aus, weil man in printf %c und nicht %s benutz. Mit der Funktion kann man nur den erste Buchstaben ausgeben und nur einen Buchstaben. Ich dachte muss eine Funktion schreiben, die auch in der Lage ist beliebiges Zeichen aus der Zeichenkette auszugeben.
Kurze Frage am Rande !k ist immer null oder?
|
|
20.02.2013 15:08 |
|
|
|