#c #malloc #strcat
Вопрос:
Я использую dirent.h для рекурсивного цикла внутри директории. Я хочу отредактировать имя файла, а затем перенести его данные и его новое имя в новый файл.
Здесь я могу зациклить и отредактировать его имя с новым расширением (.enc), единственная проблема в том, что странный символ появляется между моим ПУТЕМ и моим D_NAME (он же «fn» после редактирования).
Вот мой код и пример.
while(1) { struct dirent *entry; const char *d_name; unsigned char d_type; entry = readdir(d); if(!entry) { // no more entries in this directory -gt; break the loop break; } d_name = entry-gt;d_name; d_type = entry-gt;d_type; if(strcmp(d_name, ".")!=0) { if(strcmp(d_name, "..")!=0) { if(d_type == DT_REG) { if(de_flag=='e') { char *fn = NULL; fn = malloc(400*sizeof(char)); strcat(fn, d_name); strcat(fn, ".enc"); char abs1_path[PATH_MAX]; snprintf(abs1_path, PATH_MAX, "%s/%s", name, fn); char ch; char abs_path[PATH_MAX]; snprintf(abs_path, PATH_MAX, "%s/%s", name, d_name); printf("%s %sn", abs1_path, abs_path); FILE *source, *target; //source = fopen(abs_path, "r"); //target = fopen(abs1_path, "w");
Как вы можете видеть, на первом круге цикла нет никаких проблем с новым именем файла Поэтому я думаю, что проблема связана с malloc() или чем-то в этом роде. (я использую free(fn)) после, но не хотел показывать ВЕСЬ исходный код.
Комментарии:
1.
fn = malloc(400*sizeof(char)); strcat(fn, d_name);
—fn
содержит мусор,strcat
с ним нельзя.2. С
fn = malloc(400*sizeof(char)); strcat(fn, d_name);
вами сделано ложное предположение, котороеmalloc
инициализирует память: это не так. первоеstrcat
должно бытьstrcpy
3. Ребята, вы с ума сошли, strcat в strcpy был огромным вызовом, 3 дня поисков этого. Большое спасибо
4. «А
fn = calloc(400, sizeof char);
» сработало бы. Аfn[0] = '';
сразу послеmalloc
этого тоже.5. Я рекомендую использовать
pathconf
для поиска разрешенной длины имени, а не жестко закодированных 400, и использоватьstrncat
илиsnprintf
.