string convert



  • hi,

    ich will jeden filename/dirname nach folgenden muster umwandeln:

    filename + extension
    8 + 3

    “foo.bar” -> “FOO BAR”
    “FOO.BAR” -> “FOO BAR”
    “Foo.Bar” -> “FOO BAR”
    “foo” -> “FOO “ <-- dirname
    “foo.” -> “FOO “
    “PICKLE.A” -> “PICKLE A “
    “prettybg.big” -> “PRETTYBGBIG”
    “.big” <-- illegal
    "." -> ". "
    ".." -> ".. "

    wie koennte ich das sehr effizient machen?



  • formatierung vergessen....

    “foo.bar”            -> “FOO     BAR”
    “FOO.BAR”            -> “FOO     BAR”
    “Foo.Bar”            -> “FOO     BAR”
    “foo”                -> “FOO        “  <-- dirname
    “foo.”               -> “FOO        “
    “PICKLE.A”           -> “PICKLE  A  “
    “prettybg.big”       -> “PRETTYBGBIG”
    “.big”                                 <-- illegal
    "."                  -> ".          "
    ".."                 -> "..         "
    


  • meine version:

    static void build_name(char *str2, const char *str1, unsigned int size)
    {
    	unsingend int i, j = 0;
    	unsingend int pos = 0;
    	char *str_tmp;
    	int is_dir = 0;
    
    	// is dot or dotdot
    	if(str1[0] == '.')
    		is_dir = 1;
    	else {
    		str_tmp = strrchr(str1, '.');
    		// is filename
    		if(str_tmp != NULL)
    			pos = str_tmp - str1;
    		// is dirname
    		else
    			is_dir = 1;
    	}
    
    	for(i = 0, j = 0; i <= size; i++, j++)
    	{
    		// dirname
    		if(is_dir && i == strlen(str1))
    			break;
    
    		// filename
    		if(i == pos) {
    			i = 8;
    			j++;
    		}
    
    		if(j == size)
    			break;
    
    		str2[i] = str1[j];
    	}
    }
    

    call:
    [cpp]
    build_name(output, "TEST.TXT", 11);



  • also mein code funzt zwar aber ich find den code nicht besonders schoen und lesbar:/ faellt euch was besseres ein?

    static void build_fat_name(char *str2, const char *str1, unsigned int size)
    {
    	unsigned int i, j = 0;
    	unsigned int pos = 0;
    	char *str_tmp;
    	int is_dir = 0;
    
    	// is dot or dotdot
    	if(str1[0] == '.')
    		is_dir = 1;
    	else {
    		str_tmp = strrchr(str1, '.');
    		// is filename
    		if(str_tmp != NULL)
    			pos = str_tmp - str1;
    		// is dirname
    		else
    			is_dir = 1;
    	}
    
    	for(i = 0, j = 0; i <= size; i++, j++)
    	{
    		// dirname
    		if(is_dir) {
    			if(i == strlen(str1))
    				break;
    		}
    		// filename
    		else {
    			if(i == pos) {
    				i = 8;
    				j++;
    			}
    		}
    
    		if(j == size)
    			break;
    
    		str2[i] = str1[j];
    	}
    }
    


  • Du willst also den Namens-Teil auf genau 8 Zeichen verlängern und den Punkt zwischen Namen und Endung rausschmeißen, sehe ich das richtig? Wenn ja, wozu sollte das gut sein?

    Mal ein (ungetester) Ansatz zur Lösung:

    void build_name(char* tgt, const char* src)
    {
      memset(tgt,11,' ');tgt[11]='\0';
    
      char* p = strrchr(src,'.');
      if(p==NULL)
      {
        //keine Endung
        memcpy(tgt,src,strlen(src));
      }
      else
      {
        memcpy(tgt,src,p-src);//Name kopiert
        memcpy(tgt+8,p+1,strlen(p+1));//Endung kopiert
      }
    }
    

    (Da fehlt noch eine Sonderbehandlung für ".xyz", ".", ".." und lange Dateinamen (wenn sie vorkommen könnten))



  • hey danke cstoll!
    dein code ist ja viel kuerzer:) memcpy ist doch nicht so schlecht...

    char* p = strrchr(str1,'.');
    	memset(str2,' ',11);
    
    	if(p==NULL)
    	{
    		// no extension -> dir
    		memcpy(str2,str1,strlen(str1));
    	}
    	else
    	{
    		// is dot or dotdot
    		if(str1[0] == '.')
    			memcpy(str2,str1,strlen(str1));// copy name
    		// is filename
    		else {
    			memcpy(str2,str1,p-str1); // copy name
    			memcpy(str2+8,p+1,strlen(p+1));// copy extension
    		}
    	}
    


  • reini_ schrieb:

    hey danke cstoll!
    dein code ist ja viel kuerzer:) memcpy ist doch nicht so schlecht...

    Ja, wenn man weiß, was man damit macht 😉

    PS: Dir ist klar, daß die Abfrage 'if(str1[0]=='.')' auch für Namen ala ".big" gilt?



  • ja:)


Anmelden zum Antworten