使用getenv在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

我试图用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(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。好的。我还将添加另一个标记。