把2个string放在一起

我有

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 [],但是最大的大小是在编译时固定的,你需要额外的检查来防止缓冲区溢出。

你可能会发现strlencallocfreestrcatstrcat很有用。

或者使用字符串处理库。 为什么重新发明轮子?

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

或者使用C ++ …

如果您打算将缓冲区限制为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 */ } 

PathAppendPathAppend自动处理必要的反斜杠(当需要时),如果缓冲区不够大则返回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“,例如可能不正确)。