如何以跨平台的方式在C语言中获取环境变量

7
我在OSX和Windows Vista中使用以下代码:
#include <stdio.h>
#include <string.h>

extern char **environ;

int
main(int argc, char **argv)
{
    int i;
    for (i = 0; environ[i] != NULL; i++)
    {
        printf("var = %s - %d\n", environ[i], (int)strlen(environ[i]));
    }

    return 0;
}

在OSX上使用cc编译,在Windows上使用来自Windows SDK 7.1(其中包含Microsoft Visual C++ 2010可再发行软件包)的'cl'进行编译。
我在两个操作系统中都使用俄语定义了相同的环境变量:MY_ENV ='这里输入俄文字母'。并且字符串长度差异大约是2倍。
我计划在malloc中使用相同的长度,希望它们长度一致。如何以CRT方式获得相同的长度?

3
我猜其中一个使用UTF8编码,另一个使用本地代码页? - Nick
2
由于环境块是由操作系统预先分配的,那为什么它很重要呢?如果你想将其复制到自己的变量中,只需先测量其长度并分配足够的空间即可。 - Dark Falcon
使用VC你可以使用'wmain',它可以有第三个参数'env',该参数应该是UTF-16格式,然后你可以转换成UTF-8格式。 - Simple
1
我支持@DarkFalcon的评论。长度似乎真的不是问题。只需获取其(参数)长度,使用它来分配空间给您的变量,然后将参数复制到您分配的变量中即可。 - ryyker
我正在移植代码,认为问题在于strlen函数因为长度不同。所以现在我认为问题在于字符串复制过程中。谢谢! - egor7
显示剩余3条评论
1个回答

6
  • getenv 可在 GNU/Linux、Mac OS X 和 Microsoft Windows 平台上使用。
  • setenv 可在 GNU/Linux 和 Mac OS X 平台上使用,但无法在 Microsoft Windows 平台上使用。
  • putenvgetenv 相似,可在 GNU/Linux、Mac OS X 和 Microsoft Windows 平台上使用。

因此,getenvputenv 是你最好的跨平台选择。


1
此API不能在运行于Windows Runtime的应用程序中使用。有关更多信息,请参阅通用Windows平台应用程序不支持CRT函数。 - malat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接