Переменные окружения находятся в char *, как получить его в std :: string - PullRequest
6 голосов
/ 12 июня 2011

Я получаю переменные окружения в win32, используя GetEnvironmentStrings(). Возвращает char*.

Я хочу найти в этой строке (указатель на символ) определенную переменную среды (да, я знаю, что могу использовать GetEnvironmentVariable(), но делаю это так, потому что я также хочу напечатать все переменные среды на консоли - Я просто возлюсь).

Так что я решил преобразовать char* в std :: string и использовать поиск по нему (я знаю, что могу также использовать функцию поиска c_string, но меня больше беспокоит попытка скопировать char* в std::string). Но следующий код, похоже, не копирует все char* в std::string (это заставляет меня думать, что в char* есть символ \0, но на самом деле это не конец).

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

Есть ли способ скопировать char* в std::string (я знаю, что могу использовать strcpy() для копирования const char* в строку, но не char*).

Ответы [ 7 ]

8 голосов
/ 12 июня 2011

Вы не хотите использовать sizeof() в этом контексте - вы можете просто передать значение в конструктор. char* тривиально становится const char*, и вы не хотите использовать strcpy или printf.

Это для обычных C-строк, однако GetEnvironmentStrings() возвращает немного странный формат, и вам, вероятно, придется вставить его вручную.

const char* a = GetEnvironmentStrings();
int prev = 0;
std::vector<std::string> env_strings;
for(int i = 0; ; i++) {
    if (a[i] == '\0') {
        env_strings.push_back(std::string(a + prev, a + i));
        prev = i;
        if (a[i + 1] == '\0') {
            break;
        }
    }
}
for(int i = 0; i < env_strings.size(); i++) {
    std::cout << env_strings[i] << "\n";
}
1 голос
/ 12 июня 2011

sizeof(a) в том, что у вас есть, вернет размер char*, то есть указатель (обычно 32 или 64 бита). Вы искали функцию strlen там. И это на самом деле не требуется вообще:

std::string b(a);

должно быть достаточно для получения первой пары переменных среды.

0 голосов
/ 23 июля 2018

Результат GetEnvironmentStrings() указывает на память, содержащую все строки окружения. Подобно решению Puppy, оно будет помещено в вектор строки, где каждая строка содержит только одну переменную среды ("key=value")

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

В качестве примера у нас будут определены 2 переменные окружения:

"A=ABC"
"X=XYZ"

LPTCH b будет:

A=ABC\0X=XYZ\0\0

Каждая переменная '\0' - завершена, и, наконец, вся строка среды (b) будет завершена дополнительным '\0'.

strlen вернет размер к первому вхождению символа завершения '\0'. Последняя строка всегда будет пустой.

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

Многобайтовый символ

Для многобайтовых символов это также будет работать:

LPTCH b = GetEnvironmentStrings();
std::vector<std::wstring> env_strings;

while ((std::size_t len = wcslen(b)) > 0)
{
    env_strings.push_back(std::wstring(b));
    b += len + 1;
}
0 голосов
/ 12 июня 2011

Полагаю, вы имеете в виду функцию Windows API GetEnvironmentStrings . Итак, проверьте результат по nullptr и выполните простое присваивание:

char* env = ::GetEnvironmentStrings();
if (0 != env)
{
   std::string senv = env;
   // use senv to find variables
}
else
{
   // report problem or ignore
}
0 голосов
/ 12 июня 2011
char* a = ...;
string str(a);
string b;
b = a;
0 голосов
/ 12 июня 2011

Когда вы говорите:

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

, вы получаете размер a, который является указателем и, вероятно, равен 4. Таким образом, вы получите первые 4 символа.Я не уверен, что вы действительно пытаетесь сделать, но вы должны просто сказать:

string b( a );
0 голосов
/ 12 июня 2011

Вызывает ли проблема следующие проблемы?

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