Portál AbcLinuxu, 30. dubna 2025 16:48
char* change_basename(char* full_path,char* new_basename) { char* full_path_copy = strdup(full_path); char* dirpath = dirname(full_path_copy); size_t new_path_len = strlen(dirpath)+1+strlen(new_basename); // +1 because of "/" char* new_path = (char*)malloc( new_path_len+1 ); // +1 because of terminating NULL memset(new_path, 0, new_path_len+1); strcat(new_path, dirpath); strcat(new_path, "/"); strcat(new_path, new_basename); free(full_path_copy); return new_path; }Proč full_patch a new_basename není
char const*
? Žádný z nich nemodifikujete a pro full_patch stejně děláte kopii. Ten memset je totálně zbytečnej, použití strcat, když už znáte délky řetězců z předchozích volání, je pitomost. No ono i ta zbytečná kopie full_path
je pitomost daná použití stupidní fce, která se nehodí.
Proč full_patch a new_basename není char const*?Protoze jsem maslo, tohle si fixnu.
Ten memset je totálně zbytečnejAno je, ale nicemu nevadi protoze se zavola behem behu programu asi dvakrat. Btw. kdybych ho jen vyhodil, tak ten c string nekonci \0. Ale chapu jak to myslis.
použití strcat, když už znáte délky řetězců z předchozích volání, je pitomost.hmmm?
No ono i ta zbytečná kopie full_path je pitomost daná použití stupidní fceCo jsem mel pouzit misto dirname? :-/
Btw. kdybych ho jen vyhodil, tak ten c string nekonci \0Stačí ti nastavit první byte na 0 pro první strcat(), ten ti nakonec dá další nulu pro další strcat(), ... ale jestli to voláš 2x, ok.
hmmm?
char* full_path_copy = strdup(full_path); char* dirpath = dirname(full_path_copy); size_t dirpath_len = strlen(dirpath); size_t new_basename_len = strlen(new_basename); size_t new_path_len = dirpath_len + new_basename_len + 1; char* new_path = (char*)malloc( new_path_len+1 ); memcpy(new_path, dirpath, dirpath_len); new_path[dirpath_len] = '/'; memcpy(new_path+dirpath_len+1, new_basename, new_basename_len); new_path[new_path_len] = 0; free(full_path_copy); return new_path;Nebo třeba použít stpcpy (POSIX only), ale memcpy je lepší, když už délku znám.
Co jsem mel pouzit misto dirname?Nějakej strchr() by mohl stačit. Problém s dirname je ten, že modifikuje řetězec a musíš tedy alokovat kopii, následně alokuješ další pro výsledný řetězec. To když je pak třeba v cyklu, tak to může být ee.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.