使用getenv在C中构建路径
我试图用C语言构建一条路径,该路径将指向:使用getenv在C中构建路径,c,windows,C,Windows,我试图用C语言构建一条路径,该路径将指向: %appdata%/some/file.xx 我正在尝试使用以下方法进行操作: 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
%appdata%/some/file.xx
我正在尝试使用以下方法进行操作:
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");
有什么关于如何让这个工作的提示吗?我已经为此挣扎了好几天,但我还无法修复它
我也意识到了另一种可能性,比如:,但我不能使用它们,因为我没有那么先进 sizeof(char)
始终为1
所以
只分配一个字节。这还不够。你应该总是测试<代码> MalOC/<代码>失败,而在C(和C++中编码时,最好使用<代码> STD::String < /Cord>)或至少<代码>运算符new < /C> >
当然,您需要#包括所有
(对于malloc
&getenv
&退出..)和
(对于fopen
&perror
)和
(对于strlen
,strcat
,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
,因为fopen
无法处理s(比如http://some.host.org/some/path
)。如果您需要处理真正的URL,您需要一些客户端库,如
您可以使用PATH\u MAX
字符的本地缓冲区来代替堆分配的fullpath
。另见
不要忘记使用所有警告和调试信息进行编译(例如,如果使用,则使用gcc-Wall-Wextra-g
,并学习如何使用调试器(例如gdb
)。其他编译器选项,如-fsanize=address
可能会有所帮助。添加调试工具,如,也会有所帮助。其中一些工具可能在某些操作系统上不可用(对于C初学者,我建议使用Linux)
阅读&。sizeof(char)
始终为1
所以
只分配一个字节,这是不够的。您应该总是测试<代码> MalOC/<代码>失败,并且在C(和C++中编码时,最好使用<代码> STD::String < /Cord>或至少<代码>运算符new < /C>)。
当然,您需要
#包括所有
(对于malloc
&getenv
&退出..)和
(对于fopen
&perror
)和
(对于strlen
,strcat
,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
,因为fopen
无法处理s(比如http://some.host.org/some/path
)。如果您需要处理真正的URL,您需要一些类似的客户端库
您可以使用PATH\u MAX
字符的本地缓冲区来代替堆分配的fullpath
。另请参阅
不要忘记使用所有警告和调试信息进行编译(例如,如果使用,则使用gcc-Wall-Wextra-g
,并学习如何使用调试器(例如gdb
)。其他编译器选项,如-fsanize=address
可能会有所帮助。添加调试工具,如,也会有所帮助。其中一些工具可能在某些操作系统上不可用(对于C初学者,我建议使用Linux)
阅读&。那么,在这种情况下,我应该如何正确使用malloc()
?我应该使用myURL=(char*)malloc(256*sizeof(char));
?我尝试过这种方法,得到了完全相同的结果。@Alexander您应该使用myURL=malloc(256);
来分配一个最大长度为255的字符串,因为sizeof(字符)
是1,你不应该从malloc
中转换返回值。但是Basile的答案更好,因为它实际上计算了你需要分配的字节数。我知道了。我会试试你的方法@Basile。URL
只是一个输入错误。应该有路径
。@BasileStrynkevitch你知道为什么VS2012是我吗s在char*fullpath=malloc(fullpathlen)中的malloc
单词下面加下划线;
它说:void*类型的值不能用于初始化char*
类型的实体?@alexander,他很可能只是忘记了malloc前面的char*
。一定要像最初在代码中使用它一样添加它。那么,我应该如何正确使用malloc()
在这种情况下?我应该使用myURL=(char*)malloc(256*sizeof(char));
?我尝试过这种方法,得到了完全相同的结果。@Alexander您应该使用myURL=malloc(256);
来分配一个最大长度为255的字符串,因为sizeof(char)
是1,你不应该从malloc
中转换返回值。但是Basile的答案更好,因为它实际上计算了你需要分配的字节数。我知道了。我会试试你的方法@Basile。URL
只是一个输入错误。应该有路径
。@BasileStrynkevitch你知道为什么VS2012是我吗s在char*fullpath=malloc(fullpathlen)中的malloc
单词下面加下划线;
并且它说:void*类型的值不能用来初始化char*
类型的实体?@alexander,他很可能只是忘记了malloc前面的字符*
。一定要像你最初在代码中使用的那样添加它。为了读者的利益,你还应该发布大量错误。如果考虑SHGetFolderPath
您应该将您的问题标记为特定于Windows。好的。我还将添加另一个标记。您还应该发布大量错误,以方便读者阅读。如果考虑SHGetFolderPath
您应该将您的问题标记为特定于Windows。好的。我还将添加另一个标记。