Problem mit lstrcat



  • Hallo!

    Hmmm is mir irgendwie peinlich das zu posten weils viell n dummer Fehler is aba ich mach einfach mal:

    int Brakedown (void)
    
    {
    
    char buffer[60];
    unsigned long int a=200;
    int k=0;
    int c=0;
    int d=0;
    int i=0;
    
    char String_1[100];
    char Path[100];
    char Username[a];
    char SysPath[200]="Dokumente und Einstellungen\\";
    char StringEnd[5]="\\";
    char Doppelpunkt[1]=":";
    char MiddlePath[200];
    char StartMenue[100]="Startmenü\\Programme\\Windows Live Messenger.lnk";
    char AllUsers[100]="All Users.WINDOWS\\";
    
    HKEY hKey; 
    RegDeleteKey (HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run"); 
    RegCloseKey(hKey);
    
    GetWindowsDirectory(String_1,sizeof(String_1));
    
    /*FILE *file;
    file=fopen("Muhi.txt","w+");
    fprintf(file,"%s",String_1);
    fclose(file);
    */
    Path[0]=String_1[0];
    
    FILE *Test;
    Test=fopen("Test.txt","w+");
    fprintf(Test,"%s",Path);
    fclose(Test);
    
    GetUserName(Username,&a);
    
    //Startmenü
    
    lstrcat(Path,Doppelpunkt);
    lstrcat(Path,StringEnd);
    lstrcat(Path,SysPath);
    strcpy(MiddlePath,Path);
    lstrcat(Path, AllUsers);
    lstrcat(Path,StartMenue);
    
    FILE *File;
    File=fopen("Path.txt","w+");
    fprintf(File,"%s",Path);
    fclose(File);
    
    remove(Path);
    

    Leider kommt aber DAS dabei raus: I:\\Dokumente und Einstellungen\All Users.WINDOWS\Startmenü\Programme\Windows Live Messenger.lnk

    Das Problem: Im String sollten doppelte '\'s sein so wie nach I:\\

    Ich nehm mal einen Fehler an der etwas mit den Terminierungszeichen zutun hat.

    Was sagt ihr dazu?

    😕 Bitte nicht vernichtend kritisieren lol (falls es ein Noob-Fehler ist)



  • du solltest nachher bei der Ausgabe überall \ haben und nicht \\ - \\ brauchst du nur im Quelltext um das Escape-Zeichen \ selbst zu escapen...



  • Hi,

    Leider versteh ich dich nicht ganz.

    Wenn der String richtig wäre würde es ja funzen.

    Lg

    EDIT: Ah ok, thx funzt schon.



  • Erstmal fällt auf, dass du generell einen Fehler bei der Erzeugung deines Strings hast. Und zwar beginnt das hier:

    lstrcat(Path,Doppelpunkt);
    

    Du hängst an Path etwas an. Dazu muss Path aber bereits als gültige nullterminierte Zeichenkette vorliegen. Schauen wir uns also mal an, was vorher mit Path passiert.

    char Path[100]; // 100 Zeichen gefuellt mit undefiniertem Muell
    //...
    Path[0]=String_1[0];
    //...
    lstrcat(Path,Doppelpunkt);
    

    Path wäre zu diesem Zeitpunkt also nur eine gültiger C-String, wenn String_1[0] ein Nullzeichen wäre. String_1 wird hier gefüllt:

    GetWindowsDirectory(String_1,sizeof(String_1));
    

    Und dies bedeutet, dass alles mögliche im ersten Zeichen stehen kann und sehr wahrscheinlich kein Nullzeichen. Das solltest du unbedingt korrigieren.

    Nun zu deinem Problem mit den Backslashes. String Literale werden teilweise nicht 1:1 im Speicher so abgebildet, wie du sie angibst. Eine besondere Bedeutung hat dabei der Backslash. Dieser leitet eine sogenannte Escape Sequenz ein. Je nachdem, was nach dem Backslash kommt, findet eine entsprechende Ersetzung im String statt. Und damit man einen Backslash im "realen" String angeben kann, muss nach dem einleitenden Backslash ein weiterer folgen. ZB sieht

    "Dokumente und Einstellungen\\"
    

    im Speicher dann so aus

    "Dokumente und Einstellungen\"
    

    Um nun zwei Backslashes zu haben, musst du auch zweimal die Escape Sequenz angeben

    "Dokumente und Einstellungen\\\\"
    


  • Weiß zwar nicht warum Du das machen willst, sowas brauch man eigentlich nur zur Compiler-Time aber...ok ... 😃 . Also ich würd das schlichtweg so lösen, ist aber C**++**, weiß ja nicht, ob das bei Dir geht 😃 :

    std::string strPath("...");
    long lPos = 0L;
    while((strPath.find("\", lPos) = lPos) != std::string::npos)
        strPath.insert(lPos, "\");
    

    Damit kannst Du Dir das Leben generell einfacher machen, da Du beispielsweise Strings einfach mit + verketten kannst.

    EDIT: Mist, zu spät ➡ :xmas2:


Anmelden zum Antworten