[C++] String auswerten



  • Hier mein Jahrhundert-Killer-Algorithmus:

    1. Mit strlen(...) die Länge des strings ermitteln.
    2. Von rechts nach links durch den string laufen und abbrechen, wenn du den ersten bzw. letzten Backslash findest. Index merken.
    3. mit strncpy() aus dem übergebenen string den Inhalt vom gemerkten Index an bis zum Ende des strings in den korrigierten string kopieren.



  • #include "stdafx.h"
    #include "string.h"
    
    char* dateiname(char *vollPfad){
       char* dateiname=vollPfad;//das ergebnis
       for(char* pos=volPfad;*pos!='\0';++pos)//durch den string laufen
          if(*pos=='\\')//wenn backslash gefunden
             dateiname=pos+1;//dann beginnt der dateiname genau dahinter
       return dateiname;
    }
    
    int main (argc, argv[1])
    {
        cout<<dateiname(argv[0]);
    }
    


  • Weltwunder schrieb:

    Hier mein Jahrhundert-Killer-Algorithmus:

    1. Mit strlen(...) die Länge des strings ermitteln.
    2. Von rechts nach links durch den string laufen und abbrechen, wenn du den ersten bzw. letzten Backslash findest. Index merken.
    3. mit strncpy() aus dem übergebenen string den Inhalt vom gemerkten Index an bis zum Ende des strings in den korrigierten string kopieren.

    Hab ich ja schon probiert, das problem liegt aber leider darin, das es sich bei dem zu überprüfenden String um argv[0] handelt... 😞 ... daher meckern strcpy undsoweiter rum, das der 1Parameter nicht mit dem 2ten zusammenpassen würde

    ____________________________________________________________________________________________________

    Ok, sry ... habs Problem grad gelöst ^^

    char* dateiname(char *vollPfad)
    {
    	int i,x,y;
    	int laenge;
    	int pos;
    	char* dateiname=vollPfad;
    	char korrigiert [20];
    	laenge = strlen (dateiname);
    
    	for (i=laenge; i>0; i--)
    	{
    		if (dateiname[i] == '\\')
    		{
    			pos = i+1;
    			i=0;
    		}
    	}
    
    	sprintf (korrigiert, "%c", dateiname[pos]);
    	for (y=pos+1 , i=1; y < laenge; y++, i++)
    	{
    		korrigiert[i] = dateiname[y];
    		x=i;
    
    	}
    	korrigiert[x+1] = '\0';
    	strcpy(prog.korrigiert, korrigiert);
    
    	return 0;
    }
    


  • da wir uns hier in der C++ sparte befinden würde ich das eher mittels std::string so machen:

    #include <string>
    //...
    std::string path=argv[0];
    size_t pos=path.find_last_of('\\')+1;
    std::string file=path.substr(pos,  path.size()-pos);
    


  • #include <string>
    //...
    std::string path = argv[0];
    std::string::size_type pos = path.find_last_of('\\') + 1;
    std::string file_name = path.substr(pos);
    

    so wäre es dann wohl einfacher 🙂



  • Du solltest

    int pos;
    

    initialisieren. Wenn kein Backslash im Namen auftaucht, dann könnte es crashen.



  • was spricht eigentlich gegen meine lösung?



  • Deine Kommentare :p 😉



  • volkard schrieb:

    was spricht eigentlich gegen meine lösung?

    eigentlich nix aber schau dir mal deine main funktion an 😃 .
    abgesehen von der eigentlichen arbeit die dein code (im unterschied zu dem von "die eule") verrichtet, hast du fast alle fehler
    großzügig übernommen (#include "...", int main(argc, argv[1]))

    😉



  • tja, hab den code halt nicht getestet.

    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    char const* dateiname(char const* vollPfad){ 
       char const* dateiname=vollPfad;//das ergebnis 
       for(char const* pos=vollPfad;*pos!='\0';++pos)//durch den string laufen 
          if(*pos=='\\')//wenn backslash gefunden 
             dateiname=pos+1;//dann beginnt der dateiname genau dahinter 
       return dateiname; 
    } 
    
    int main (int argc, char* argv[]) 
    {
        cout<<dateiname(argv[0])<<'\n';
    	//oder zum weiterverarbeiten
    	string d=dateiname(argv[0]);
    }
    

Anmelden zum Antworten