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:)