将2个字符串放在一起

时间:2010-12-23 17:50:20

标签: c windows

我有

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

但是我需要添加我的系统驱动器号,这是一个char *和几个目录。我一直对此感到困惑。例如,在PHP中,您执行string1 . string2

如何解决此问题?

谢谢!

编辑:其中一个变量可能是变量,具体取决于程序运行的计算机,即系统驱动器号。 “只是你知道”:P

5 个答案:

答案 0 :(得分:6)

char pathname[PATH_MAX];
if (snprintf(pathname, sizeof pathname, "%s/%s", dir, file) >= sizeof pathname)
    goto error;

答案 1 :(得分:3)

您必须分配一个足够大的新char *来保存新字符串并将字符复制到其中,确保在正确的时间取消分配。您也可以使用char [],但最大大小在编译时是固定的,您需要额外的检查以防止缓冲区溢出。

您可能会发现strlencallocfreestrcat等功能很有用。

答案 2 :(得分:0)

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

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

或者使用C ++ ......

答案 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“,例如可能不正常)。