strlen klappt nicht



  • Ich will von einem Namen die letzten 3 Zeichen abschneiden also Dennis = nis
    Dies klappt leider nicht so hier ma mein Code:

    char  str[255]= ("Dennis");
    char  laststr[255] = ("");
    const int len = strlen(str);
    char lastChar[];
    lastChar = str[len-3] + str[len-2] + str[len-1] ;
    

    Da kommen folgende Fehlermeldungen:
    C:\Dokumente und Einstellungen\Simon\Eigene Dateien\Test.c:23: error: array size missing in 'lastChar'
    C:\Dokumente und Einstellungen\Simon\Eigene Dateien\Test.c:24: error: incompatible types in assignment

    Was mache ich verkehrt?



  • ...
    char lastChar[4];
    strcpy (lastChar, str+len-3);
    ...
    

    🙂



  • danke geht
    aber wenn ich jetzt dies mache:

    char  str[1000];
    char file = "C:\\Test.txx";
    char  laststr[255] = ("");
    const int len = strlen(str);
    char lastChar[4]; 
    strcpy (str,file);
    printf ("%s\n",str);
    strcpy (lastChar, str+len-3);
    

    Dann hat lastChar kein Inhalt



  • da sind viele fehler drin...

    char  str[1000];
    char file = "C:\\Test.txx";        // 'file' ist nur ein zeichen gross
    char  laststr[255] = ("");
    const int len = strlen(str);       // 'str' hat zufälligen inhalt, 'len' dann auch
    char lastChar[4]; 
    strcpy (str,file);                 // 'file' wird als pointer verwendet, wahrscheinlich crashed es hier
    printf ("%s\n",str);
    strcpy (lastChar, str+len-3);      // hier kommen alle fehler zusammen und das schmiert mit sicherheit ab
    

    du musst dir noch mal die unterschiede von char, char* und char[] zu gemüte führen...
    🙂



  • Hmmm..... wie muss ich des verbessern kannste mir pls en bisschen helfen???





  • Wenn ich es jetzt so mache geht es immer noch net:

    char  str[1000] = ""; 
    char file[250] = "C:\\Test.txx"; 
    char  laststr[255] = (""); 
    const int len = strlen(str);        
    char lastChar[4]; 
    strcpy (str,file);                  
    printf ("%s\n",str); 
    strcpy (lastChar, str+len-3);
    


  • wegen des

    char  str[1000] = "";
    

    ist 'len' 0



  • Hä und welchen Wert muss ich jetzt str hinzufügen?



  • du könntest das const wegmachen und erst nach einer zuweisung auf str die länge abfragen
    (immer wieder)

    oder du lässt const musst aber davor str initialieren damit du eine länge hast

    edit:

    sonst bleibt es null, siehe ten



  • Wenn ich es so versuche klappt es leider auch nicht:

    char fil[1000] = "txt";
    char str[1000];
    char  laststr[255] = ("");
    const int len = strlen(str);
    char lastChar[4]; 
    printf ("%s",str);
    strcpy (lastChar, str+len-3);
    printf ("%s",lastChar);
    

    So wird beim ausgeben von lastChar beim ersten mal " " ausgegeben und beim zweiten mal txt und dann mal wieder C:\aaa.txt
    Wieso?



  • Wo kommt das c:\aaa.txt her?

    Bitte ein Beispiel wo alles drin ist was Du mit den Variablen anstellst. In dem Beispiel oben sind nur zwei Ausgaben, keine einzige Eingabe und auch kein "c:\aaa.txt" enthalten. Deckt sich also nicht mit Deiner Schilderung.



  • Dry Gin schrieb:

    Wenn ich es so versuche klappt es leider auch nicht:

    char fil[1000] = "txt";
    char str[1000];
    char  laststr[255] = ("");
    const int len = strlen(str);
    char lastChar[4]; 
    printf ("%s",str);
    strcpy (lastChar, str+len-3);
    printf ("%s",lastChar);
    

    So wird beim ausgeben von lastChar beim ersten mal " " ausgegeben und beim zweiten mal txt und dann mal wieder C:\aaa.txt
    Wieso?

    leider sehe ich nur einmal printf ("%s",lastChar); wo sind die anderen aufrufe ?

    edit:

    da war wohl einer schneller 😃



  • Auf der Seite http://www.c-plusplus.net/forum/viewtopic-var-t-is-172937.html
    Da wird Rekurisv gesucht und ich übergebe dann den Pfad an die Funktion
    naja egal hier mal die ganze funktion:

    void searching(WIN32_FIND_DATA wfd, char path[],char suchen[]) 
    { 
      char file[500]; 
    FILE *fp; 
    char a[230];
    char fil[1000] = "txt";
    char str[1000];
    char  laststr[255] = ("");
    const int len = strlen(str);
    char lastChar[4]; 
    strcpy(file, path); 
    strcat(file, "\\"); 
    strcat(file, wfd.cFileName); 
    strcpy (a,path);
    strcpy (str,wfd.cFileName);
    printf ("%s",str);
    strcpy (lastChar, str+len-3);
      /* Alle gefundenen Dateien überschreiben  */ 
      /* Sehr gefährlich bei                    */ 
      /* dirsearch("c:\\", "*.*", REKURSIV_JA); */ 
      /* Windows muß dann neu installiert werden*/ 
    
    printf ("%s\n",lastChar);
    printf ("%s\n",fil);
    printf ("%s\n",file);
    system ("PAUSE");
    if ((strcmp(lastChar,fil))== 0)
      {
      fp = fopen (file, "wt"); 
      printf ("Es klapp\n");
      if (fp) 
        { 
              fprintf(fp, "Dies ist ein Test"); 
            fclose(fp);   
           } 
    
      /* wichtig: Datei-Stream wieder schließen */ 
    
      /* Statt dessen nur den Dateinamen ausgeben */ 
      printf("%s\n", file); 
    } 
    }
    


  • ich sehe du benutzt windoze 😉
    wenn du den pfad in seine komponenten zerlegen willst: http://msdn2.microsoft.com/en-us/library/e737s6tf(VS.80).aspx



  • Verstehe die Funktion splitpath nicht ganz



  • Dry Gin schrieb:

    Verstehe die Funktion splitpath nicht ganz

    sowas sagt man nicht. versuchs nochmal.



  • wer sich mit seinen problemen mehr beschäftigt versteht es besser



  • Wenn ich es ma so versuche:

    #include <windows.h> 
    #include <conio.h> 
    #include <stdio.h> 
    #include <string.h>
    #include <stdlib.h>
    #include <wchar.h>
    char *fbprint(char *format, ...) 
    { 
      static char buf[1000]; 
    
      vsnprintf(buf, sizeof(buf), format, (char *)((&format)+1)); 
      return (char *)buf; 
    } 
    
    void searching(WIN32_FIND_DATA wfd, char path[],char suchen[]) 
    { 
      char file[500]; 
    FILE *fp; 
    char a[230];
    char fil[1000] = "txt";
    char  laststr[5000];
    char lastChar[1000]; 
    char str[1500];
    const int len = strlen(str);
    strcpy(file, path); 
    strcat(file, "\\"); 
    strcat(file, wfd.cFileName); 
    strcpy (a,path);
    strcpy (str,file);
    strcpy (lastChar, str+len-3);
      /* Alle gefundenen Dateien überschreiben  */ 
      /* Sehr gefährlich bei                    */ 
      /* dirsearch("c:\\", "*.*", REKURSIV_JA); */ 
      /* Windows muß dann neu installiert werden*/ 
    
    printf ("%s\n",lastChar);
    printf ("%s\n",fil);
    printf ("%s\n",file);
    printf ("%s\n",str);
    printf ("%s\n",wfd.cFileName);
    printf ("%s\n",a);
    printf ("%d\n",len);
    printf ("%s\n",laststr);
    system ("PAUSE");
    if ((strcmp(lastChar,fil))== 0)
      {
      fp = fopen (file, "wt"); 
      printf ("Es klapp\n");
      if (fp) 
        { 
            fprintf(fp, "Dies ist ein Test"); 
            fclose(fp);   
           } 
    
      /* wichtig: Datei-Stream wieder schließen */ 
    } 
    }
    
    void dirsearch(char *path, char *filter, int flagrekursiv) 
    { 
      HANDLE hFindFile; 
      WIN32_FIND_DATA wfd; 
    char dirfound[2000]; 
      hFindFile = FindFirstFile(fbprint("%s\\%s", path, filter), &wfd); 
      if (hFindFile != INVALID_HANDLE_VALUE) 
        { do 
            { if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) 
                { /* FILE_ATTRIBUTE_DIRECTORY nicht gesetzt -> kein Ordner */ 
                  searching(wfd, path,filter);   
                } 
                else /* FILE_ATTRIBUTE_DIRECTORY gesetzt -> ist Ordner */ 
                { if (flagrekursiv && 
                      strcmp(wfd.cFileName, "." ) != 0 && /* no current dir */ 
                      strcmp(wfd.cFileName, "..") != 0)   /* no parent dir */ 
                    { 
                      /* ================= */ 
                      /* rekursiver Aufruf */ 
                      /* ================= */ 
    strcpy(dirfound, path); 
    strcat(dirfound, "\\"); 
    strcat(dirfound, wfd.cFileName); 
    dirsearch(dirfound, filter, flagrekursiv);
                      dirsearch(path, filter, flagrekursiv); 
                    } 
                } 
            } 
          while(FindNextFile(hFindFile, &wfd) != 0); 
          FindClose(hFindFile); 
        } 
    } 
    
    #define REKURSIV_NEIN 0 
    #define REKURSIV_JA   1 
    
    int main() 
    { 
      /* Maske "*.*" oder "*" Voraussetzung für rekursives Suchen */ 
      dirsearch("c:\\test", "*.*", REKURSIV_JA); 
      getch(); 
      return 0; 
    }
    

    in meinem Ordner Test sind folgende Dateien C:\Test\juibiugfb.txt
    C:\Test\Hallo.txt
    C:\Test\Test1\Abc.txt

    Jetzt steht aber nur In der Textdatei Abc Was.
    Wie muss ich des abändern?


Anmelden zum Antworten