我有
programConfig = fopen("program.conf", "a+");
不过,我需要prepend我的系统驱动器号是一个char *和几个目录。 我一直为此感到困惑。 在PHP中,例如,你做string1 . string2
string1 . string2
。
我该如何解决这个问题?
谢谢!
编辑:其中一个variables可能是可变的,这取决于运行程序的计算机,即系统盘符。 “就这样你知道”:P
char pathname[PATH_MAX]; if (snprintf(pathname, sizeof pathname, "%s/%s", dir, file) >= sizeof pathname) goto error;
您必须分配一个足够大的新char *来保存新字符串,并将字符复制到其中,以确保它在正确的时间被释放。 你也可以使用char [],但是最大的大小是在编译时固定的,你需要额外的检查来防止缓冲区溢出。
你可能会发现strlen
, calloc
, free
和strcat
等strcat
很有用。
如果您打算将缓冲区限制为MAX_PATH
(因为99%的Windows应用程序可以),那么您可以简单地使用PathAppend
函数。
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
是PathAppend
自动处理必要的反斜杠(当需要时),如果缓冲区不够大则返回FALSE
。
如果你想在Windows上操作路径,你应该看看Shell路径处理函数 。 请注意,要使用它们,您必须#include <shlwapi.h>
并链接到shlwapi.lib
。
使用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变种不会奇迹般地保护所有可能的漏洞 – 通过切断字符串,你可以允许用户访问除你选中的东西之外的东西:ie(“c:\”真的真的很长文件路径\ file.txt“可能是确定的,但是strncpy / cat可能会将其截断为”c:\ real“,例如可能不正确)。