Положить 2 строки вместе - PullRequest
       2

Положить 2 строки вместе

1 голос
/ 23 декабря 2010

у меня

programConfig = fopen("program.conf", "a+");

Однако мне нужно добавить букву моего системного диска, которая является символом *, и еще пару каталогов. Я всегда был озадачен этим. Например, в PHP вы делаете string1 . string2.

Как мне решить эту проблему?

Спасибо!

Редактировать: одна из переменных может быть переменной в зависимости от того, на каком компьютере запущена программа, а именно от буквы системного диска. «Просто чтобы ты знал»: P

Ответы [ 5 ]

6 голосов
/ 23 декабря 2010
char pathname[PATH_MAX];
if (snprintf(pathname, sizeof pathname, "%s/%s", dir, file) >= sizeof pathname)
    goto error;
3 голосов
/ 23 декабря 2010

Вы должны выделить новый символ *, который достаточно большой, чтобы вместить новую строку и скопировать в нее символы, убедившись, что она освобождена в нужное время. Вы также можете использовать char [], но максимальный размер фиксируется во время компиляции, и вам потребуются дополнительные проверки для предотвращения переполнения буфера.

Вы, вероятно, найдете полезными такие функции, как strlen, calloc, free и strcat.

0 голосов
/ 23 декабря 2010

Если вы все равно собираетесь ограничить свой буфер MAX_PATH (как это делают 99% приложений Windows), вы можете просто использовать функцию PathAppend shlwapi.

TCHAR buffer[MAX_PATH];
buffer[0]=_T('c') /* the drive letter */
buffer[1]=_T(':');
if(!(PathAppend(buffer, directory) && PathAppend(buffer, _T("program.conf")))
{
    /* handle the error */
}
/* now in buffer you have your string */

(здесь я объявил буфер как TCHAR для максимальной универсальности, если вы хотите использовать обычные символы, вы можете изменить TCHAR на char и удалить все макросы _T; если вы вместо этого хотите использоватьwchar_t s, измените TCHAR на wchar_t, удалите _T и вставьте L после каждого строкового / символьного литерала)

Если вместо этого у вас есть полный путь к каталогу, готовый в буфереMAX_PATH символов, вы можете просто сделать

if(!PathAppend(buffer,_T("program.conf")))
{
    /* handle the error */
}

Приятно то, что PathAppend автоматически обрабатывает необходимые обратные слеши (когда они необходимы) и возвращает FALSE, если буфер не большойдостаточно.

Если вы хотите манипулировать путями в Windows, вам действительно стоит взглянуть на Функции обработки пути оболочки .Обратите внимание, что для их использования необходимо #include <shlwapi.h> и указать ссылку на shlwapi.lib.

0 голосов
/ 23 декабря 2010

Или используйте библиотеку обработки строк.Зачем изобретать велосипед?

http://www.zork.org/safestr/

Или использовать C ++ ...

0 голосов
/ 23 декабря 2010

Использовать strncat .

char filepath[1024];
char drive[] = "C:\\", dir[] = "dir\\", file[] = "file.txt";

strncpy(filepath, drive, sizeof(filepath)-1);
strncat(filepath, dir, sizeof(filepath)-strlen(filepath)-1);
strncat(filepath, file, sizeof(filepath)-strlen(filepath)-1);
programConfig = fopen(filepath, "a+");

Обратите внимание, что в этом случае, поскольку путь состоит из строк, известных априори, strcpy / strcat было бы достаточно вместо strncpy / strncat, новсякий раз, когда используется пользовательский ввод, вы обычно должны использовать strncpy / strncat (или даже strlcpy / strlcat, если он доступен), если только вы не распределяете память должным образом динамически.

Также обратите внимание, что использование сортов strncpy / strncat магически не защищает от всехвозможно, уязвимости - обрезая строку, вы можете позволить пользователю получить доступ к чему-то другому, кроме того, что вы проверили: т.е. («c: \ действительно действительно очень длинный путь к файлу \ file.txt» может быть в порядке, когда вы проверяете это, нонапример, strncpy / cat может обрезать его до "c: \ real", что может быть не в порядке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...