(gelöst)int to char --> Problem



  • Hallo zusammen
    ich hab mal ein kleines Programm für meine Firma geschriebe, welches die Arbeits erleichtern sollte.
    Jetzt funktioniert es nicht ganz so wie ich es erhofft habe.
    Es stürz spätestens nach dem 1.Ordner erstellen ab.
    Vielleicht könnt ihr mir weiterhelfen.

    #include <stdio.h>
    #include <windows.h> 
    #include <stdlib.h>
    #include <string.h>
    
    main(){
    int x,i,anzahl;
    char string[150],projekt[80];
    
    printf("Bei welcher Projektnummer starten ?   ");
    scanf("%i",&i);
    printf("Wie viele Projektordner sollen erstellt werden ?   ");
    scanf("%i",&anzahl);    
    for(x=1; x<=anzahl; x++) {     
        strcpy(projekt, "");
        sprintf(projekt, "%d", i);
        strcpy(string, "md ");
        strcat(string, projekt);
        strcat(string, "-");
        strcat(string, " &cd " );
        strcat(string, projekt);
        strcat(string, "-" );
        strcat(string, " &md " );
        strcat(string, projekt);
        strcat(string, "-Administration");
        strcat(string, " &md " );
        strcat(string, projekt);
        strcat(string, "-Berechnung");
        strcat(string, " &md " );
        strcat(string, projekt);
        strcat(string, "-Pläne");
        strcat(string, " &cd " );
        strcat(string, projekt);
        strcat(string, "-Administration" );
        strcat(string, " &md " );
        strcat(string, projekt);
        strcat(string, "-Dokumente");
        strcat(string, " &md " );
        strcat(string, projekt);
        strcat(string, "-E-Mails");
        strcat(string, " &md " );
        strcat(string, projekt);
        strcat(string, "-Fotos");
        strcat(string, " &cd " );
        strcat(string, projekt);
        strcat(string, "-E-Mails" );
        strcat(string, " &md " );
        strcat(string, "Ausgang");
        strcat(string, " &md " );
        strcat(string, "Eingang");
        strcat(string, " &cd.." );
        strcat(string, " &cd.." );
        strcat(string, " &cd " );
        strcat(string, projekt);
        strcat(string, "-Pläne" );
        strcat(string, " &md " );
        strcat(string, projekt);
        strcat(string, "-Bearbeiten");
        strcat(string, " &md " );
        strcat(string, projekt);
        strcat(string, "-Pläne");
        strcat(string, " &mkdir " );
        strcat(string, projekt);
        strcat(string, "\"-Planeingang von Dritten\"");
        strcat(string, " &md " );
        strcat(string, projekt);
        strcat(string, "\"-Revidiert (ungültig)\"");
        system(string);
        i++;
        }
           }
    

    lg. schlubl



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Das ist kein C++, sondern C. In C++ könnte man das sehr schön mit einem std::stringstream lösen und alles wäre gut.

    In deinem C Programm kommt es unter Umständen zu einem Buffer Overflow. Eventuell musst du das Char Array vergrößern. Noch besser wäre es aber, wenn du tatsächlich auf C++ umsteigst.



  • ,,,,,, schrieb:

    Noch besser wäre es aber, wenn du tatsächlich auf C++ umsteigst.

    Dafür würde ich bei batch-Files bleiben.



  • Aua, das tut selbst mir weh ... woher willst Du wissen, daß da alles so reinpaßt?
    Was macht system(string)? Oder kommst Du gar nicht erst so weit, was ich eher vermute. Das Stichwort heißt Debugger, kannst Du mal präzisieren, wo die Kiste abstürzt?



  • ich glaube selber auch das es ein overflow ist, aber was meinst du mit char array vergrössern ?
    das programm stürzt nach dem ersten schleifendurchgang ab, windows bringt di meldung "Projekt.exe funktioniert nicht mehr"
    lg. schlubl



  • So richtig entschieden hast du dich aber noch nicht, ob es Win oder Unix sein soll?
    Mal machst du md mal mkdir. Auch weiß ich nicht, was "&" dort soll, soll das Unix oder VisualBasic sein? Ich schlage vor, du bringst mal Struktur in deine Kette von Pfaden, alles was konstant ist hinterlegst du auch so, z.B.

    char *pfad[]={"%d-Administration",
                  "%d-Berechnung",
                  ...};
    

    Oder wie auch immer deine Pfade heißen sollen.



  • Schlubl schrieb:

    ich glaube selber auch das es ein overflow ist, aber was meinst du mit char array vergrössern ?
    das programm stürzt nach dem ersten schleifendurchgang ab, windows bringt di meldung "Projekt.exe funktioniert nicht mehr"
    lg. schlubl

    Diese Meldung kommt nur, wenn du eine Release-Version deines Programms erstellst. Versuch es doch mal mit einem Debug-Build, dann kannst du während der Laufzeit Schritt für Schritt durch deinen Code wandern und ganz genau sehen, was schiefläuft. Hört sich doch besser an als Raten, oder?



  • Schlubl schrieb:

    ich glaube selber auch das es ein overflow ist, aber was meinst du mit char array vergrössern ?
    das programm stürzt nach dem ersten schleifendurchgang ab, windows bringt di meldung "Projekt.exe funktioniert nicht mehr"
    lg. schlubl

    Mach einmal vor Zeile 49 ein

    printf("\nLänge von String: %d", strlen(string));
    

    rein. Wundert Dich jetzt noch etwas?
    Bei Sachen, deren Länge nicht fix ist, empfielt sich dynamische Speicherreservierung per malloc() & co oder wenigstens solltest Du string so groß machen, daß wirklich alles reinpaßt und nochmal: Das Stichwort heißt Debugger!!!



  • geht das mit dem DEV-C++ nicht ?
    hab da immer kompilieren gedrückt



  • Schlubl schrieb:

    geht das mit dem DEV-C++ nicht ?
    hab da immer kompilieren gedrückt

    Waaas? Auch der DEV C++ hat einen Debugger, aber frag' mich bloß nicht, wie man den anwirft.

    Aber Dein ganzer Ansatz ist schonmal gequirltes Hirn mit Ei, aber ein wenig printf()- Debugging hätte es auch schon getan, dann siehst Du ja, wo Dein Array übergeht. Zuwenig Platz, irgendwann überschreibst Du was Kritisches und BUMM!

    Mit DEV C++ hat das jedoch gar nix zu tun!



  • Schreib doch mal vor dem system(string); ein puts(string);
    Wenn dein Programm soweit kommt, siehst du schon mal was an system übergeben wird.

    Man kann auch mit sprintf arbeiten.

    char *s;
    s = string;
    s += sprintf(s,"md %d-", i");
    s += sprintf(s," &cd %d-", i");
    s += sprintf(s," &md %d-Administration", i");
    ...
    puts(string);
    

    Evtl. Fehler sind infolge von Fieberwahn möglich. 🙄



  • hab den speicher vergrössert, hätte nicht gedacht das so viel braucht.
    also problem gelöst danke 🙂



  • DirkB schrieb:

    Man kann auch mit sprintf arbeiten.

    char *s;
    s = string;
    s += sprintf(s,"md %d-", i");
    s += sprintf(s," &cd %d-", i");
    s += sprintf(s," &md %d-Administration", i");
    ...
    puts(string);
    

    Evtl. Fehler sind infolge von Fieberwahn möglich. 🙄

    Ja, kann gut sein, besonders wenn sprintf() was negatives zurück gibt. Evtl. wärs so schöner...

    int n=0;
    char *s;
    s = string;
    sprintf(s,"md %d-%n", i,&n);
    s += n;
    sprintf(s," &cd %d-%n", i,&n);
    s += n;
    sprintf(s," &md %d-Administration", i);
    ...
    puts(string);
    

    Natürlich müsste man noch die Rückgabe von sprintf() testen:)


Anmelden zum Antworten