我正在尝试在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");
有关如何使用此功能的任何提示?我已经在这方面苦苦挣扎了几天,但我还是无法修复它。
我也知道另外一种可能性:SHGetSpecialFolderPath,SHGetFolderPath()和SHGetKnownFolderIDList()但我无法使用它们,因为我不是那么先进。
答案 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>
,strlen
,strcat
....)
并且您不确定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
)。如果您需要处理正版网址,则需要HTTP个libcurl客户端库。
您可以使用http://some.host.org/some/path
字符的本地缓冲区来代替分配的fullpath
堆。另请参阅this thread。
不要忘记编译所有警告&amp;调试信息(例如,如果使用GCC,则使用PATH_MAX
,并了解如何使用调试器(例如gcc -Wall -Wextra -g
)。其他编译器选项,例如gdb
可能会有所帮助。valgrind等附加调试工具也很有帮助。某些操作系统可能无法使用其中一些工具(对于C语言的初学者,我建议使用Linux)。