Конкатенация пути и базового имени - PullRequest
4 голосов
/ 20 августа 2009

basename (3) и dirname (3) могут разбивать абсолютный путь на соответствующие компоненты.

Если не использовать snprintf (3) , существует ли естественный посикс-совместимый вызов библиотеки, который выполняет обратное - берет каталог и имя файла и объединяет их?

Конкатенация для меня работает хорошо, но иногда может быть немного утомительной.

1 Ответ

7 голосов
/ 20 августа 2009

насколько я знаю, в POSIX такой функции нет. Однако в руководстве GNU libc есть хорошая вспомогательная функция :

char *concat (const char *str, ...)
  {
   va_list ap;
   size_t allocated = 100;
   char *result = (char *) malloc (allocated);

   if (result != NULL)
     {
       char *newp;
       char *wp;

       va_start (ap, str);

       wp = result;
       for (s = str; s != NULL; s = va_arg (ap, const char *))
         {
           size_t len = strlen (s);

           /* Resize the allocated memory if necessary.  */
           if (wp + len + 1 > result + allocated)
             {
               allocated = (allocated + len) * 2;
               newp = (char *) realloc (result, allocated);
               if (newp == NULL)
                 {
                   free (result);
                   return NULL;
                 }
               wp = newp + (wp - result);
               result = newp;
             }

           wp = mempcpy (wp, s, len);
         }

       /* Terminate the result string.  */
       *wp++ = '\0';

       /* Resize memory to the optimal size.  */
       newp = realloc (result, wp - result);
       if (newp != NULL)
         result = newp;

       va_end (ap);
     }

   return result;
 }

использование:

const char *path = concat(directory, "/", file);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...