我有
programConfig = fopen("program.conf", "a+");
但是我需要添加我的系统驱动器号,这是一个char *和几个目录。我一直对此感到困惑。例如,在PHP中,您执行string1 . string2
。
如何解决此问题?
谢谢!
编辑:其中一个变量可能是变量,具体取决于程序运行的计算机,即系统驱动器号。 “只是你知道”:P
答案 0 :(得分:6)
char pathname[PATH_MAX];
if (snprintf(pathname, sizeof pathname, "%s/%s", dir, file) >= sizeof pathname)
goto error;
答案 1 :(得分:3)
您必须分配一个足够大的新char *来保存新字符串并将字符复制到其中,确保在正确的时间取消分配。您也可以使用char [],但最大大小在编译时是固定的,您需要额外的检查以防止缓冲区溢出。
您可能会发现strlen
,calloc
,free
和strcat
等功能很有用。
答案 2 :(得分:0)
答案 3 :(得分:0)
如果您要将缓冲区限制为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
,请将TCHAR
更改为wchar_t
,删除_T
并在每个字符串/字符文字后添加L
如果您的完整目录路径已准备好缓冲区MAX_PATH
个字符长,则可以直接执行
if(!PathAppend(buffer,_T("program.conf")))
{
/* handle the error */
}
好处是PathAppend
自动处理必要的反斜杠(当需要它们时)并且如果缓冲区不够大则返回FALSE
。
如果你想在Windows上操纵路径,你应该真正看看Shell Path Handling Functions。请注意,要使用它们,您必须#include <shlwapi.h>
并链接到shlwapi.lib
。
答案 4 :(得分:-1)
使用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“,例如可能不正常)。