2016-04-03 2 views
-2

Я изучаю процесс обучения C++, поэтому я делаю несколько программ/инструментов для выполнения некоторых простых операций на компьютере. В этом примере я создаю программу, которая будет размещать браузеры на компьютере (она будет использоваться для очистки файлов cookie браузера и т. Д.). Вероятно, есть более продвинутые способы сделать это более эффективно, но я стараюсь сделать это как можно более простым на данный момент.Const char concatenation и getenv()

До сих пор я пытаюсь выяснить, существует ли каталог «C: \ Program Files (x86) \ Google \ Chrome». Я получаю адрес в каталоге файлов программ, используя getenv ("Program Files (x86)", но как добавить оставшийся адрес после? Я не могу использовать оператор + для конкатенации, так как переменная const char * (bool PathIsDirectory() требует параметра const char * в качестве параметра).

std::cout << "Searching for browsers..." << std::endl; 
const char *chromePath; 
chromePath = getenv ("ProgramFiles(x86)"); 

bool result = PathIsDirectory(chromePath); 

if(result == true) 
{ 
    std::cout << "-- Google Chrome - FOUND" << std::endl; 
} 
else 
{ 
    std::cout << "-- Google Chrome - NOT FOUND" << std::endl; 
} 
+0

Можете ли вы получить путь к 'ProgramFiles' с' getenv'? 'getenv' предназначен для получения переменных среды. – ForceBru

+0

@ForceBru в соответствии с этим да: http://stackoverflow.com/questions/9594066/how-to-get-program-files-x86-env-variable – vu1p3n0x

+0

Я сомневаюсь, что 'ProgramFiles (x86)' обозначает допустимую переменную среды. –

ответ

3

Вы можете сохранить результат getenv() в std::string объекта (как указано в комментариях). И тогда вы можете добавить остальную часть пути с помощью оператора +, как это:

#include <string> 
//... 
std::string chromePath = getenv ("ProgramFiles(x86)"); 
chromePath += "\\remaining\\path"; 
bool result = PathIsDirectory(chromePath.c_str()); 

Обратите внимание, что вы будете иметь, чтобы избежать обратной косой черты, как показано выше.

+0

Проблема в том, что строковые переменные не допускаются в PathIsDirectory(), но только const char * в качестве параметра. Однако я мог создать новую константу const char * для остальной части пути к каталогу google chrome, а затем использовать strcat (const char * variable 1, const char * variable 2) и сохранить их в конечном «полном пути» const char *, действительный для использования в PathIsDirectory(). См. Мой ответ выше. – saltcracker

+1

Как сказал @petesh в комментариях к вопросу, вы можете получить 'const char *' из 'std :: string', используя' yourstring.c_str() '. Ваш собственный ответ не является безопасным способом сделать это, поскольку он вызывает неопределенное поведение. Пожалуйста, рассмотрите возможность использования 'std :: string'. – vu1p3n0x

+0

vu1p3n0x является правильным. Я обновил свой ответ соответственно. Посмотрите http://en.cppreference.com/w/cpp/string/byte/strcat. Вы увидите, что strcat фактически записывает в память, на которую указывает возвращаемое значение getenv(). Это неправильно, потому что вы не помните эту память. – tonisuter

Смежные вопросы