Fehlersuche
lima-city → Forum → Programmiersprachen → C/C++ und D
anwendung
behandeln
buffer
code
dank
erlauben
falle
listen
machen
manipulation
multiple zuweisungen
parameter
passen
regel
speichern
sprache
string
zeichenkette
zeiger
zucker
-
Hey,
folgende Problemstellung habe ich versucht mit C zu lösen:
Lese die Parameter beim Programmaufruf, erweitere diese mit ".x" und gebe diese wieder aus, bzw. speichere diese.
Mein Problem dabei ist, dass nur jeder zweite Parameter behandelt wird. Kann mir jemand sagen warum?
Code:#include <stdio.h> #include <string.h> int main(int argc, char * argv[]) { int i; char *buffer[argc+1]; for (i=1;i<argc;i++) { buffer[i]=strcat(argv[i],".x"); printf("%s\n", buffer[i]); } return (0); }
Gruß
hamid -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo,
1) Du speicherst die Parameter nicht, wie du sagst, sondern verweist nur auf sie.
2) strcat funktioniert ein bisschen anders als du es verwendest. Der erste Parameter muss z.B. groß genug sein (also der Speicherbereich, wo dieser hinzeigt), um das Ergebnis aufzunehmen.
Also, wenn du zum Beispiel dein Programm mit
./test abc def ghi
aufrufst, erhälst du als Ergebnis
abc.x x.x ghi.x
Der Eingangsstring war nämlich:
abc\0def\0ghi\0\0
woraus nach dem ersten Durchlaufen
abc.x\0f\0ghi\0\0
wird, nach dem zweiten Durchlaufen
abc.x.x\0ghi\0\0
und nach dem dritten Durrchlaufen
abc.x.x\0ghi.x\0
Versuch's mal mit
#include <stdio.h> #include <string.h> #include <malloc.h> int main (int argc, char* argv [] ) { int i; char* buffer [argc]; for (i = 0; i < argc; i++) { buffer [i] = (char*) malloc (strlen (argv [i] ) + 3); strcpy (buffer [i], argv [i] ); strcat (buffer [i], ".x" ); printf ("%s\n", buffer [i] ); } //Hierher kommt die Magie, die mit den Parametern passieren soll for ( ; argc; free (buffer [--argc] ) ); return 0; }
Nota bene: Bei den meisten OS steht im ersten Parameter der eigene Name der Anwendung.
Beitrag zuletzt geändert: 11.6.2009 18:56:52 von census -
Strings passen in C nie ihre Größe an. Auch nicht beim ersten Mal reinschreiben.
Man sollte sich stets vor Augen halten, dass Strings in C kein Datentyp sind: Ein String kennt auch seine Länge nicht, oder sein Encoding oder sonst etwas. Ein String ist nichts weiter als eine Adresse auf ein Stück Speicher (das hoffentlich dir gehört). Die Stringroutinen, wie strcpy, strcat, etc oder printf ("%s", ...) behandeln dann dieses Stück Speicher wie eine Folge von Zeichen (in der Regel ASCII-codiert), das mit einem 0-Byte beendet wird. Die Stringmanipulation in C ist reine Speicherherumschieberei.
strcpy macht nichts anderes als (src und dest sind die Zeiger auf den Quell- und Zielstring):
for ( ; *src; *dest++ = *src++); *dest = 0;
strcat macht nichts anderes als (src und dest sind die Zeiger auf den Quell- und Zielstring):
for ( ; *dest; dest++); for ( ; *src; *dest++ = *src++); *dest = 0;
Wenn man das im Hinterkopf behält, ist die Stringmanipulation größtenteils selbsterklärend.
Kleiner Ausflug: C-Strings sind nicht die einzige gängige Möglichkeit Zeichenketten darzustellen. PASCAL zum Beispiel verweist auf einen Speicherbereich, in dem zuerst die Länge und danach der Inhalt steht. Dadurch ist der PASCAL-String 0-komplett. LUA ist auch 0-komplett. JAVA und die verschiedenen OO-Sprachen bauen um die Zeichenkette ganze Klassen außenrum, die vieles an Manipulation erlauben. -
Danke für die Infos. Ich werde versuchen das zu verinnerlichen)
Eine Frage zu LUA.
Hast du hierfür ein empfehlenwertes tutorial?
Gruß
Hamid -
Komisch, bist jetzt schon der zweite der mich nach einem LUA-Tutorial fragt. Ich würde ja gern eines schreiben, aber die Tutorials sind hier ja deaktiviert.
Um ehrlich zu sein: Man braucht auch keines. Wenn Du irgendeine imperative Sprache (C, C++, Java) kannst, dann musst du dich nur in die Syntax, den Zucker und die Eigenheiten von LUA einlesen und gut isses. Die Unterschiede zu C sind marginal; mir fallen eben nur die folgenden ein:
- multiple Zuweisungen: a, b = f (x)
- Funktionen sind L-Values: Shadowing oder Hooking einfach durch Zuweisung,
- Listen sind primitiv und assoziativ,
- So ungefähr alles sind Listen,
- RegEx sind primitiv IIRC,
- Viel syntaktischer Zucker: f (a, b) kann man auch a:f (b) schreiben, damit sich die OO-Leute freuen,
- Garbage Collection,
- NIL ist was anderes als 0,
- Als C-Progger wirst du immer wieder vergessen nach dem IF ein THEN zu schreiben und lauter überflüssige Semikola setzen.
Schau einfach mal auf lua.org
cu -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage