使用getenv在C中构建路径

时间:2015-07-13 05:29:08

标签: c windows

我正在尝试在C中构建一个指向:

的路径
%appdata%/some/file.xx

我正在尝试使用these functions进行操作:

char *getenv( 
   const char *varname 
);
wchar_t *_wgetenv( 
   const wchar_t *varname 
);
char *appData = getenv("AppData"); //so far so good

char *myURL;
myURL = (char *)malloc(sizeof(char));

//when I comment the next two lines, everything is ok, but if I uncomment them I get tons of errors
strcpy(myURL, appData);
strcat(myURL, "/some/path.xx");

FILE *myFile = fopen(myURL, "r");

有关如何使用此功能的任何提示?我已经在这方面苦苦挣扎了几天,但我还是无法修复它。

我也知道另外一种可能性:SHGetSpecialFolderPathSHGetFolderPath()SHGetKnownFolderIDList()但我无法使用它们,因为我不是那么先进。

1 个答案:

答案 0 :(得分:4)

sizeof(char)始终为1。

所以

myURL = (char *)malloc(sizeof(char));

只分配一个字节。这还不够。您应该始终针对失败测试malloc,并且在 C 中进行编码时使用you should not cast the result of malloc(在C ++中,更好地使用std::string或至少operator new

当然,您需要#include所有<stdlib.h>malloc&amp; getenv&amp; exit ...)和{{1} }(适用于<stdio.h>&amp; fopen ...)&amp; perror(适用于<string.h>strlenstrcat ....)

并且您不确定strcpy是否通过返回非getenv("AppData")字符串而成功。

所以你应该尝试:

NULL

我使用的是 char *appdata = getenv("AppData"); if (!appdata) appdata="/some/default/path"; size_t appdatalen = strlen(appdata); char* restpath= "/some/path.xx"; size_t restpathlen = strlen(restpath); size_t fullpathlen = // 1 additional byte for terminating \0 appdatalen+restpathlen+1; char *fullpath = malloc(fullpathlen); if (!fullpath) { perror("malloc"); exit(EXIT_FAILURE); }; strcpy (fullpath, appdata); strcat (fullpath, restpath); FILE *myFile = fopen(fullpath, "r"); ,而不是fullpath,因为myURL无法处理URL s(例如fopen)。如果您需要处理正版网址,则需要HTTPlibcurl客户端库。

您可以使用http://some.host.org/some/path字符的本地缓冲区来代替分配的fullpath堆。另请参阅this thread

不要忘记编译所有警告&amp;调试信息(例如,如果使用GCC,则使用PATH_MAX,并了解如何使用调试器(例如gcc -Wall -Wextra -g)。其他编译器选项,例如gdb可能会有所帮助。valgrind等附加调试工具也很有帮助。某些操作系统可能无法使用其中一些工具(对于C语言的初学者,我建议使用Linux)。

了解undefined behavior&amp; buffer overflow