Frage zu Zeiger auf Char
-
Hi @all,
also dass hier is mein Programmli...;)
#include <cstdlib> #include <stdio.h> #include <iostream.h> using namespace std; int main(int argc, char *argv[]) { char * zk = "Dateiname.Endung"; char * teilzk = strrchr (zk, '.'); *teilzk = "EinAndererWertfuerEndungInclusivePunkt"; cout <<teilzk<<endl; system ("PAUSE"); return EXIT_SUCCESS; }
und etz hab ich nur mal eine Frage dazu-weil ich's obwohl ich's selbst geschrieben habe, nich ganz verstehe =). Also...Ich deklariere einen Zeiger auf Char auf 17 Zeichen (inclusive 0, insofern ich mich nicht verzählt habe).
Danach rufe ich die Funktion strrchr auf, welche mir einen Teilstring zurückliefert -und zwar in char * teilzk. So...noch is alles paletti bei mir...aber...die nächste Zeile...omei o mei..normalerweise wenn ich den Wert einer Zeigervariablen ändern will, benötige ich doch den Stern (den Indirektionsoperator). Aber...hier bekomme ich vom Compiler eine Fehlermeldung. Wenn ich jedoch den Stern weglasse, kompiliert er mir das Proggi einwandfrei. Woran liegt das ? Sry aber ich versteh das noch nicht wirklich...ich hab ja gelernt, dass man- wenn man auf den Wert eines Zeigers zugreifen will, bzw. diesen ändern will, den Stern vor dem Namen der Zeigervariablen benötigt. Aber hier eben nicht ...nur wieso ?Ich würd mich echt freuen, wenn mir das jemand erklären könnte.
Das is nämlich die Hauptursache, warum ich so manche C++-Programme noch nicht so kapiere-weil ich noch Probleme damit habe, wann ich den Stern benötige und wann nichtSchönen Gruß
CMan
-
wenn du teilzk="..." schreibst, dann versuchst du, dem char, auf das teilzk zeigt, einen string zuzuweisen. strings sind aber vom typ char! dein programm versucht also einem speicherplatz vom typ char einen wert vom typ char* zuzuweisen, und das gibt vom compiler einen fehler!
richtig ist teilzk="...". zwar ist teilzk ein zeiger, aber auch zeigervariablen kann man werte zuweisen! nämlich andere zeiger. und da strings in c ja auch zeiger sind (nämlich zeiger auf char) kann man teilzk auch einen string zuweisen.
du solltest aber beachten, daß der string damit nicht kopiert wird! wenn du auf die obige weise einen string mehreren zeigervariablen zuweist, dann zeigen alle variablen auf den selben string. schließlich wird ja nur der zeiger auf den string und nicht der string selbst zugewiesen.
-
PS:
da du die funktion strrchr() benutzt solltest du auch#include<cstring>
includen.
und statt
#include <stdio.h>
solltest du
#include<cstdio>
schreiben.
-
PPS:
und natürlich solltest du auch statt#include <iostream.h>
besser
#include<iostream>
schreiben! ersteres geht nicht bei jedem c++ compiler und ist auch nicht gerade standard-konform!
-
Aja ok...vielen Dank... ich denke mal dass ich das verstanden habe.
Aber eines ist mir dann noch unklar...da Zeichenketten (Strings) ja nur Zeiger auf char sind, also vom Typ char*, weise ich in dem Programm von mir der Zeigervariablen teilzk folglich die Addresse des Strings : "EinAndererWertfuerEndungInclusivePunkt" zu (korrigiere mich bitte, sollte ich falsch liegen) und die Zeigervariable teilzk zeigt somit auf diesen Wert. Gut.. ich hoffe das sollte ich richtig verstanden haben.
Wenn ich nun aber ein Programm wie folgt habe:int main(int argc, char *argv[]) { char * pc1 = "Hallo"; char * pc2 = ""; char * pc3; pc3 = pc1; *pc3 = *pc2; system ("PAUSE"); return EXIT_SUCCESS; }
...ich weise also in diesem Proggi der Zeigervariablen pc3 die Addresse der Zeigervariablen pc1 zu. Somit zeigt pc3 auf denselben Speicherbereich wie pc1.
Aber...in der nächsten Zeile hab ich scheinbar wieder nen Schmarrn gemacht =)...
Mein Ziel ist es nämlich dass ich über die Zeigervariable pc3 den Wert der Variablen pc1 ("Hallo") in "" ändern kann....aber des klappt leider noch nicht so recht...
-
so aus dem Stand würde ich sagen
char* pcA="HiDu"; char** pcB=&pcA; strcpy(*pcB, "geaendert...");
-
Hi...ich nochmal...hab gerade gemerkt, dass des völliger Schwachsinn is, was ich da in dem letzten Programm geschrieben hab.
Hab gerade in meinem C++-Buch nachgesehen und da steht ja drin, dass man Strings mit strcpy kopieren soll. Hab also die Zeile:
*pc3 = *pc2;
in :
strcpy (pc3, "");
abgeändert...half aber leider auch nicht viel...
ich bekomme immer noch eine Fehlermeldung zurück.