Funktion Zeiger auf eine Zeichenkette

Neue Frage »

Auf diesen Beitrag antworten »
Lycaner 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.
 
Auf diesen Beitrag antworten »
Karlito

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
Auf diesen Beitrag antworten »
Lycaner

Ich dachte " Zeiger []" ist meine Array
Auf diesen Beitrag antworten »
Karlito

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
 
Auf diesen Beitrag antworten »
Lycaner

Zeiger zeigt auf eine Adresse und Array reserviert Speicherplatz
Auf diesen Beitrag antworten »
Karlito

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
Auf diesen Beitrag antworten »
Lycaner

Wenn es gleich ist, wie kann man ein Zeiger auf eine Zeichenkette machen?
Auf diesen Beitrag antworten »
Karlito

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
Auf diesen Beitrag antworten »
Lycaner

Nein, ich habe alle Zeichenkette[] durch *Zeichenkette ersetzt, kein Schritt weiter gekommen. Ich rate mehr, als das ich weiß, was ich da machen soll(
Auf diesen Beitrag antworten »
Karlito

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
Auf diesen Beitrag antworten »
Lycaner

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?
Auf diesen Beitrag antworten »
Karlito

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
Auf diesen Beitrag antworten »
Lycaner

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(
Auf diesen Beitrag antworten »
Karlito

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
Auf diesen Beitrag antworten »
Lycaner

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?
Auf diesen Beitrag antworten »
Karlito

Hallo,

Zitat:
Original von Lycaner
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.


Das hast du falsch verstanden! %c gibt das Ascii-Zeichen zu einem 8-Bit-Wert zurück. Du könntest auch
printf("%c\n", 0x41); schreiben. Das Würde dann einfach ein "A" ausgeben. Es ist also abhängig von einem Konkreten Wert.

%s hingegen nimmt einen Zeiger entgegen und liest ab der Adresse des Zeigers die Werte Byteweise aus dem Speicher und stellt diese als Zeichenkette dar bis es auf den Wert 0 trifft.

Zitat:
Original von Lycaner
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.


Nicht laut der Aufgabenstellung die du geschickt hast... Vlt hast du nicht die gesamte Aufgabenstellung geschickt?

Um das Verständnis zu verbessern könntest du ja mal rausfinden, wie du das ein beliebiges Zeichen ausgeben kannst, aber ohne die Funktion xy zu verändern. Dazu musst du den Wert des Zeigers (Die Adresse), den Du an xy übergibst, verändern.

Zitat:
Original von Lycaner
Kurze Frage am Rande !k ist immer null oder?


Woher nimmst du !k?

VG,

Karlito
Auf diesen Beitrag antworten »
Lycaner

Es war die gesamte Aufgabenstellung.

!k ist aus einer anderen Aufgabe. Ich bereite mich für eine Klausur vor und rechne die alte Klausuren durch. Deswegen habe ich auch so viele Fragen und nicht so viel Zeit, das selber aus den Büchern oder Google zu erarbeiten, obwohl es für die Klausur besser wäre.
Auf diesen Beitrag antworten »
Karlito

OK.

Welchen Wert !k annimmt, hängt davon ab, welchen Wert k vorher hatte. Für k = 0 ist !k = 1 und für alle anderen Werte ist !k = 0.

VG,

Karlito
Auf diesen Beitrag antworten »
Lycaner

Ok. Alles verstanden. Danke.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »