Static Variable: Buchstabe auslesen (schleife!)
-
Hallo,
Ich denke was ich will ist klar ;-). Ich geb mal meinen code:
#include <stdio.h> #include <string.h> #include <ctype.h> int getChar(char arr[]) { static int index=0; if(arr[index++] == '\0') { index = 0; return 0; } return (int)arr[index++]; } int main(int argc, char **argv) { char str[]="Hello"; int i; while( (i = getChar(str)) != '\0') { printf("%c", (char)i); } printf("\n"); return 0; }
es erscheint folgendes:
$ ./st el
Kann mir jemand helfen? Vielen Dank.
Staticalypto!
-
Du erhöhst in der Schleife zweimal (das erste Mal im if(), das zweite Mal bei der Rückgabe) den Index - dadurch überspringst du die Hälfte der Zeichen.
-
Danke CStoll,
Ich habe noch einen zusätzlichen Logikfehler gemacht. Ich möchte das Programm gerne für andere hier publizieren, vielleicht findet ihr noch Fehler oder Verbesserungsvorschläge.
Danke CStoll, dass du mir so rasch und unkompliziert helfen konntest
#include <stdio.h> #include <string.h> #include <ctype.h> int getChar(char arr[]) { static int index=0; if(arr[index] == '\0') { index = 0; return 0; } return (int)arr[index++]; } int main(int argc, char **argv) { char str[]="Hello"; int i; while( (i = getChar(str)) != '\0') { printf("%c", (char)i); } printf("\n"); return 0; }
Viel Spass mit der Source
Staticalypto!
-
Wenn du willst, kann ich auch gerne noch ein paar Kommentare zum Inhalt des Programms dazugeben:
- die ganzen Cast's in dem Programm kannst du weglassen, die sind redundant (aka unnötig).
- Was macht die Funktion, wenn sie nach 20 Durchläufen durch String1 plötzlich einen 5 Zeichen langen String2 entgegengeworfen bekommt?
- (und als Bonus: Die Header ctype.h und string.h werden im Programm gar nicht benötigt)
- Und das wichtigste: Ich würde nie eine Funktion schreiben, um stückweise durch einen String laufen zu können.
-
Hallo CStoll
-
Du willst also sagen, dass die Funktion nicht Thread-safe ist? Verstand ich das richtig? ich könnte ja noch ein _r implementieren, wo man einen pointer zu index mitgeben kann. Oder?
-
Das Beispiel diente nur als Training, ich wollte wissen wie Funktionen wie "verzeichnisse durchlaufen unter linux" gemacht wurden.
-
Wenn ich code, schreibe ich am Anfang immer paar Header rein, die ich eventuell benötigen werde. Somit muss ich nicht bei jeder Funktion denken "ahh, wird diese gebraucht?". Denkst du das ist grundsätzlich eine schlechte Idee?
-
Danke für deine offene Kritik
Staticalypto!
-
-
Staticalypto! schrieb:
- Du willst also sagen, dass die Funktion nicht Thread-safe ist? Verstand ich das richtig? ich könnte ja noch ein _r implementieren, wo man einen pointer zu index mitgeben kann. Oder?
Die Funktion ist noch nicht einmal "normal safe" - von Thread-Safe will ich noch gar nicht reden.
- Das Beispiel diente nur als Training, ich wollte wissen wie Funktionen wie "verzeichnisse durchlaufen unter linux" gemacht wurden.
OK, aus dem Gesichtspunkt kann ich das Programm verstehen.
- Wenn ich code, schreibe ich am Anfang immer paar Header rein, die ich eventuell benötigen werde. Somit muss ich nicht bei jeder Funktion denken "ahh, wird diese gebraucht?". Denkst du das ist grundsätzlich eine schlechte Idee?
Alles eine Sache der Gewohnheit - wirklich stören tun die Header dort nicht.
(ich mach's normalerweise anders herum: wenn ich eine Funktion (oder Klasse) benötige, suche ich mir den passenden Header - entweder sofort oder nachdem mich der Compiler auf den unbekannten Bezeichner hingewiesen hat)
-
Sorry, ich versteh nicht wo das Problem liegt. Oder wie ich das Problem beseitigen kann. Kannst du mir bitte auf die Sprünge helfen? Danke
Staticalypto!
-
Das Problem ist, daß die Funktion Mist baut, wenn du sie im Wechsel mit verschiedenen Strings (vor allem verschieden langen) fütterst.
(und daß die Funktion in der Praxis wohl wenig Sinn ergibt)
-
Hallo CStoll,
Stell dir vor, du hast z.B. vllt 20 Strukturen und möchtest alle durchlaufen und die aktuellen Werte zur Current-Struktur zuweisen. dann könntest du doch ähnlich durchlaufen, zuweisen, etc. wär doch praktisch, oder nicht?
Danke, Staticalypto!
-
Wieso einfach, wenn's auch umständlich geht? Wenn ich alle Strukturen in einem Array durchlaufen will, nehme ich eine schlichte for-Schleife - da brauche ich keine Hilfsfunktion, die mir die Strukturen stückweise zureicht:
for(int i=0;i<ArrayGroesse;++i) { mach_was(Array[i]); }
-
Ja super. ich hab wiedermal zu kanalisiert gedacht :-(.
Danke
Staticalypto!