2011-06-12 11 views
6

Estoy recuperando las variables de entorno en win32 usando GetEnvironmentStrings(). Devuelve un char*.Las variables de entorno están en un char * cómo hacerlo llegar a std :: string

Quiero buscar esta cadena (puntero char) para una variable de entorno específica (sí, sé que puedo usar GetEnvironmentVariable() pero lo hago así porque también quiero imprimir todas las variables de entorno en la consola también - I estoy jugando).

Así que pensé que iba a convertir el char* a un std :: string & utilización encontrar en él (sé que también se puede utilizar una función C_STRING hallazgo pero estoy más preocupado por tratar de copiar un char* en un std::string). Pero el siguiente código parece no copiar todo el char* en el std::string (me hace pensar que hay un \0 en el char*, pero en realidad no es el final).

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

¿Hay una manera de copiar un char* en un std::string (Sé que puedo utilizar para copiar un strcpy()const char* en una cadena, pero no un char*).

+2

¿Quién intenta * cerrar esto como un duplicado exacto? ¡Es una pregunta completamente diferente! – Xeo

+0

@Xeo: Bueno, no, no es ... La función 'getenv' /' GetEnvironmentVariable' utilizada es diferente, pero el resultado es el mismo ... Todo lo que OP tiene que hacer es reemplazar la llamada 'getenv' con un 'GetEnvironmentVariable' llamada. – rubenvb

+2

@rubenvb: Excepto GetEnvironmentStrings() devuelve un formato dudoso, que el OP requiere * ayuda * específica. No puedes simplemente reemplazar 'getenv' con' GetEnvironmentStrings() '. – Puppy

Respuesta

8

usted no desea utilizar sizeof() en este al contexto que sólo puede pasar el valor al constructor. char* se convierte trivialmente en const char* y tampoco desea utilizar strcpy o printf.

Eso es para cuerdas en C convencionales; sin embargo, GetEnvironmentStrings() devuelve un formato algo extraño y es probable que deba insertarlo manualmente.

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

gracias Entiendo, por lo que debe ser cierto, que char * de variables de entorno está lleno de \ 0 caracteres. Tomo su enfoque, pero creo que en lugar de iterar sobre cada carácter, usaré strtok de la función c string para dividirlo en los \ 0 caracteres – Mack

+0

@Mack: no se puede hacer eso. 'GetEnvironmentStrings' devuelve la memoria que no tiene permiso para escribir, y' strtok' no es seguro para subprocesos, y de todos modos es terriblemente inseguro. Use un enfoque C++. – Puppy

+0

@Mack: para no olvidar, 'strtok' es una cosa espantosamente * incorrecta * en sí misma. Es una máquina de estado singleton en toda regla. – Xeo

0

¿El siguiente causa algún problema?

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

Bueno, tengo más en std :: string, imprime: = :: = :: \ now – Mack

1

sizeof(a) en lo que tiene arriba, devolverá el tamaño de char*, es decir, un puntero (32 o 64 bits por lo general). Usted estaba buscando la función strlen allí. Y en realidad no se requiere en absoluto:

std::string b(a); 

debería ser suficiente para obtener el primer par de variables de entorno.

+1

Consulte la documentación de GetEnvironmentStrings; no será suficiente. – Puppy

+0

gracias, pero lo he intentado y sigue imprimiendo = :: = me hace pensar que hay un carácter \ 0 al final de cada variable de entorno, por lo que me sale un poquito – Mack

+0

@Mack, sí, el arriba solo captará el primero, lo siento, olvidé ese diseño de bloque de entorno. – Mat

0

Cuando dicen:

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

que está recibiendo el tamaño de una, que es un puntero y es probablemente 4. Así obtendrá los primeros 4 caracteres. No estoy seguro de lo que realmente están tratando de hacer, pero usted debería ser capaz de decir simplemente:

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

supongo que te refieres a la API de Windows función GetEnvironmentStrings. Por lo tanto, pruebe el resultado contra nullptr y realice una asignación simple:

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