kostenloser Webspace werbefrei: lima-city


Fehlersuche

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    hamid

    hamid hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. c****s

    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
  4. Autor dieses Themas

    hamid

    hamid hat kostenlosen Webspace.

    Hey,

    danke für die schnelle Antwort. Bin davon ausgegangen, wenn argv[] vom Typ char* ist, dass sich die einzelnen dann der Größe anpassen. Schließlich passiert das beim ersten reinschreiben ja auch.

    Gruß
    Hamid
  5. c****s

    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.
  6. Autor dieses Themas

    hamid

    hamid hat kostenlosen Webspace.

    Danke für die Infos. Ich werde versuchen das zu verinnerlichen;-))

    Eine Frage zu LUA.
    Hast du hierfür ein empfehlenwertes tutorial?

    Gruß
    Hamid
  7. c****s

    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
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!