环境变量在一个char*中,说明如何将其转换为std::字符串

Environment Variables are in a char* how to get it to a std::string

本文关键字:字符串 std 说明 转换 一个 char 环境变量      更新时间:2023-10-16

我正在使用GetEnvironmentStrings()检索win32中的环境变量。它返回一个char*

我想在这个字符串(char指针)中搜索一个特定的环境变量(是的,我知道我可以使用GetEnvironmentVariable(),但我这样做是因为我也想在控制台上打印所有的环境变量——我只是在摆弄)。

所以我想把char*转换成std::string&在上面使用find(我知道我也可以使用c_string find函数,但我更关心的是尝试将char*复制到std::string中)。但下面的代码似乎并没有将所有的char*复制到std::string中(这让我认为char*中有一个字符,但实际上并不是末尾)。

char* a = GetEnvironmentStrings();
string b = string(a, sizeof(a));
printf( "%s", b.c_str() );  // prints =::= 

有没有办法将char*复制到std::string中(我知道我可以使用strcpy()const char*复制到字符串中,但不能使用char*)。

您不希望在此上下文中使用sizeof(),只需将值传递到构造函数即可。char*很容易变成const char*,您也不想使用strcpyprintf

这适用于传统的C字符串,但是GetEnvironmentStrings()返回的格式有点奇怪,您可能需要手动插入它。

const char* a = GetEnvironmentStrings();
int prev = 0;
std::vector<std::string> env_strings;
for(int i = 0; ; i++) {
    if (a[i] == '') {
        env_strings.push_back(std::string(a + prev, a + i));
        prev = i;
        if (a[i + 1] == '') {
            break;
        }
    }
}
for(int i = 0; i < env_strings.size(); i++) {
    std::cout << env_strings[i] << "n";
}

sizeof(a)将返回char*的大小,即指针(通常为32或64位)。您正在查找函数strlen。实际上根本不需要:

std::string b(a);

应该足以获得第一个环境变量对。

GetEnvironmentStrings()的结果指向包含所有环境字符串的内存。类似于Puppy的解决方案,它将被放入字符串的向量中,其中每个字符串只包含一个环境变量("key=value"

std::vector<std::string> env_strings;
LPTCH a = GetEnvironmentStrings();

例如,我们将定义2个环境变量:

"A=ABC"
"X=XYZ"

LPTCH a将是:

A=ABCX=XYZ

每个变量都以''结尾,最后完整的环境字符串(a)将以一个额外的''结尾。

CCD_ 31将返回终止字符CCD_ 32的第一次出现的大小。最后一个字符串将始终为空。

while ((std::size_t len = strlen(a)) > 0)
{
    env_strings.push_back(std::string(a, len));
    a += len + 1;
}

多字节字符

对于多字节字符,它也可以工作:

LPTCH a = GetEnvironmentStrings();
std::vector<std::wstring> env_strings;
while ((std::size_t len = wcslen(a)) > 0)
{
    env_strings.push_back(std::wstring(a, len));
    a += len + 1;
}
FreeEnvironmentStrings(a);

以下情况是否会导致任何问题?

char* a = GetEnvironmentStrings();
string b;
b=a;
printf( "%s", b.c_str() );

当你说:

string b = string(a, sizeof(a));

你得到的是a的大小,它是一个指针,可能是4。因此,您将获得前4个字符。我不确定你到底想做什么,但你应该可以说:

string b( a );
char* a = ...;
string str(a);
string b;
b = a;

我假设您指的是Windows API GetEnvironmentStrings函数。因此,针对nullptr测试结果并执行简单的赋值:

char* env = ::GetEnvironmentStrings();
if (0 != env)
{
   std::string senv = env;
   // use senv to find variables
}
else
{
   // report problem or ignore
}