2011-06-12 72 views
6

我使用GetEnvironmentStrings()在win32中檢索環境變量。它返回一個char*環境變量在char *中如何獲取到std :: string

我想搜索一個特定的環境變量的字符串(字符指針)(是的,我知道我可以使用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*)。

+2

f *試圖將它關閉爲完全重複的情況?這是完全不同的問題! – Xeo 2011-06-12 11:54:22

+0

@Xeo:嗯,不,它不是......使用的'getenv' /'GetEnvironmentVariable'函數是不同的,但結果是一樣的...所有OP的要做的就是用'getenv'調用'GetEnvironmentVariable'調用。 – rubenvb 2011-06-12 11:58:47

+2

@rubenvb:GetEnvironmentStrings()除外返回一個不禮貌的格式,OP需要特定的幫助。你不能用'GetEnvironmentStrings()'替換'getenv'。 – Puppy 2011-06-12 12:00:09

回答

8

你不想使用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] == '\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"; 
} 
+0

謝謝我明白,所以它必須是真實的,環境變量char *充滿\ 0字符。我採取你的方法,但我認爲,而不是迭代每個字符,我會使用C字符串函數strtok將其分割爲\ 0字符 – Mack 2011-06-12 12:02:19

+0

@Mack:你不能這樣做。 'GetEnvironmentStrings'返回你不允許寫入的內存,'strtok'不是線程安全的,無論如何它都是非常不安全的。使用C++方法。 – Puppy 2011-06-12 12:03:23

+0

@Mack:不要忘記,'strtok'本身就是一個可怕的*錯誤的東西。這是一個全面的單身狀態機。 – Xeo 2011-06-12 12:08:19

0

以下是否會引發任何問題?

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

好吧,我得到了更多的std ::字符串,它打印出來:= :: = :: \ now – Mack 2011-06-12 11:58:01

1

sizeof(a)在你有什麼上面將返回的char*的尺寸,即一個指針(32或64位通常)。您正在尋找功能strlen。並且它根本不需要:

std::string b(a); 

應該足以獲得第一個環境變量對。

+1

檢查GetEnvironmentStrings文檔 - 這是不夠的。 – Puppy 2011-06-12 11:54:20

+0

謝謝,但我已經試過&它仍然打印= = =它使我認爲每個環境變量的末尾有一個\ 0字符,這就是爲什麼我得到這一點 – Mack 2011-06-12 11:55:48

+0

@Mack,是的,上面只會抓到第一個,對不起我忘了那個環境塊的佈局。 – Mat 2011-06-12 12:00:29

0

當你說:

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

你得到的大小,這是一個指針,可能是4所以,你會得到第4個字符。我不知道你真正想要做的,但你應該能夠只是說:

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

我想你指的是Windows API的GetEnvironmentStrings功能。因此,針對nullptr測試結果並執行簡單賦值:

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