Странный символ после редактирования имени файла через dirent

#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 .