char
-
@drakon: Zitat aus dem Buch "C++ lernen und professionell anwenden".
char stadt[] = "München";"Dann ist stadt ein char-Zeiger auf stadt[0]..."
Vielleicht verstehe ich das falsch oder mein Buch hat einen Fehler. Deine Antwort ist aber eigentlich einleuchtend.
edit:
Ich habe jetzt auch gerade mal eine Frage:char* x = "Affe"; cout << x << endl;x ist ein Zeiger, der laut meines Buches auf das erste Element eines Arrays zeigt und somit auf "A" zeigen müsste. Wenn ich jedoch x ausgebe, dann wird "Affe" ausgegeben und nicht "A". Warum? Das wurde zwar schon teilweise besprochen, doch das ist mir auch nicht klar.
Könnt ihr mir da helfen?
Dankeschön!
lg, freakC++
-
Das ist ein Fehler in Buch.
stadtist ein Array vonchar's.
-
Ok! Das beantwortet dann doch auch eigentlich meine nachträglich gestellte Frage?!
lg, freakC++
-
freakC++ schrieb:
edit:
Ich habe jetzt auch gerade mal eine Frage:char* x = "Affe"; cout << x << endl;x ist ein Zeiger, der laut meines Buches auf das erste Element eines Arrays zeigt und somit auf "A" zeigen müsste. Wenn ich jedoch x ausgebe, dann wird "Affe" ausgegeben und nicht "A". Warum? Das wurde zwar schon teilweise besprochen, doch das ist mir auch nicht klar.
Der überladene operator<< für const char* gibt halt nicht nur das Zeichen aus, auf das x zeigt, sondern den nullterminierten String, der bei x beginnt, und das ist halt "Affe". Wenn du nur das A ausgeben willst, musst du
cout << *x;schreiben.
-
Das stand vorher noch nicht da.

Nein das liegt daran, dass es eine Überladung für C-Strings gibt und somit der ganze string ausgegeben wird (bis zur 0 Terminierung).
Wenn es das nicht machen würde, dann würde es dir sowieso nicht den hinter dem Zeiger gespeichertem Wert, sondern den Zeiger selbst ausgeben. Probier mal das hier:
int n = 2; int* pn = &n; std::cout << pn;Ist also eher spezielles Verhalten eben weil man da weiss, dass es ein C-String sein soll.
-
Ahh..überladener Operator! Das sagt alles

Verstanden!
Vielen Dank
lg, freakC++
-
#include <iostream> #include <malloc.h> using namespace std; char* strstr(char str[],char substr[]) { int i=0,j=0;char tmp[100]={}; int var=0,k=0,m=0; while(str[k]) { if(str[k]==substr[j]) { for(j=0;substr[j] && (str[k+j]==substr[j]);j++); if(!substr[j]) k+=strlen(substr); j=0; } tmp[m]=str[k];m++;k++; } tmp[m]=0; return tmp; } int main() { char* y="hallo du alter , alt sein ist gut"; char* x="alt"; cout<<strstr(y,x); //Ausgabe stimmt noch nicht }also meine Funktion schneidet jetzt das Wort "alt" aus dem STring raus.
Nur leider klappt die Ausgabe nicht?
-
Wie schon gesagt,
das ist ein ansi c thema,
mit c++ löst man soetwas anders.
Nur weil cout verwendet wird ist das noch lange kein c++.
Zumindest sehe ich das so.Wobei sich mir der Sinn des Auscheidens und Zurückgeben nicht wirklich erschließt.
Die Funktion strstr gibt es schon, funktioniert aber leicht anders ...
http://www.cplusplus.com/reference/clibrary/cstring/strstr/Wie auch immer eine (unnötige) temporäre Variable auf den Stack zu legen
und dann zu returnen, wobei ja gerade der Stack abgeräumt wird
ist keine gute Idee. Die Ausgabe ist undefiniert.Alternativ (aber wozu?):
char* stringFind (char* str, char substr) { return strstr(str, substr) ? substr : ""; }Gruß Frank
-
Hallo,
ich verstehe deinen Satz nicht. Was soll den dabei rauskommen? Das Problem hat Frank Erdorf schon angesprochen. Da Du einen Zeiger auf tmp zurückgibst, muss dieses Array static sein. Sonst funktioniert nichts:char* strstr(char str[],char substr[]) { int i, j, var, k, m; i = j = var = k = m = 0; static char tmp[100]={}; //Da du einen Zeiger zurückgibst, ist das static hier Pflicht! //... }lg, freakC++
-
freakC++ schrieb:
Hallo,
ich verstehe deinen Satz nicht. Was soll den dabei rauskommen? Das Problem hat Frank Erdorf schon angesprochen. Da Du einen Zeiger auf tmp zurückgibst, muss dieses Array static sein. Sonst funktioniert nichts:Das Problem durch static zu lösen, verschiebt das Problem nur. Dadurch folgt eine ganze Kaskade weiterer Fehlerquellen, weil man hier eine Funktion mit extremen Nebeneffekten baut.
Besser wäre es, es so zu machen wie die C Standardbibliothek es für C-Strings vormacht: Übergabe eines Zielarrays über die Parameterliste in welches dann geschrieben wird und für welches der Nutzer Sorge zu tragen hat:
char* strstr(char str[],char substr[], char destination[])
Hierbei wird als Returnwert destination benutzt. Wobei dies nur Geschmackssache ist, die ich aus Konsistenzgründen zur C-Standardbibliothek beibehalten habe. Auf diese Weise kann sich der Benutzer entscheiden, ob er lieber den Stil per Rückgabewert mag oder lieber den Stil mit Call by Reference.
-
Die von SeppJ angesprochenenden Mängel stimmen schon. Doch das ist hier der Grund, warum das gepostete Programm nicht funktioniert. Es gibt jedoch tatsächlich noch bessere Lösungen, auch da so leicht Speichermüll entstehen kann, wenn der Zeiger auf das static Objekt mal verloren gehen sollte.
lg, freakC++
-
Im übrigen wurde hier auch eine Lösung für das Problem gepostet:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-270971-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html#include <string> #include <iostream> void substr(char *a, const char *b); int main() { char a[] = "hallo du alter , alt sein ist gut"; char b[] = "alt"; substr(a, b); printf("%s", a); } void substr(char *a, const char *b) { const unsigned int lenOfA = strlen(a); const unsigned int lenOfB = strlen(b); if (lenOfB > lenOfA) { return; } unsigned int pos = 0; for (unsigned int i = 0; i < lenOfA; ++i, ++pos) { for (unsigned int j = 0; j < lenOfB; ++j, ++i) { if (a[i] != b[j]) { i -= j; break; } } a[pos] = a[i]; } a[pos] = '\0'; }