환경 변수 가져오기(C++)

8944 단어 WindowsC++
게임에 데이터를 저장한 디렉터리를 게임과 같은 폴더로 만들까 AppData에 넣을까 고민하던 중 갑자기 생각나 적어놨다.
get_environment_variable.cpp
#include <cstdlib>
#include <string>
#include <stdexcept>

std::string get_environment_variable(const char* environment_name) {
    size_t buf;
    char buffer[1024];
    if (getenv_s(&buf, buffer, 1024, environment_name)) throw std::runtime_error("read error");
    if (buf == 0) throw std::runtime_error("not such environment variable");
    return std::string(buffer);
}
사용 예
main.cpp
#include <iostream>
#include <stdexcept>
int main() {
    try {
        std::cout << get_environment_variable("UserProfile") << std::endl;
        return 0;
    }
    catch(std::exception &er){
        std::cout << er.what() << std::endl;
        return -1;
    }
}

실행 결과와 echo 명령으로 불렀을 때의 결과 비교


실행 결과



echo 명령으로 불렀을 때의 결과



나는 반드시 버퍼 구역의 사이즈를 낭비할 것이라고 생각하지만, 그만두어라.
게임을 만들 때 환경 변수라고 부르려면 일본어 경로를 구상해야 한다.
컴퓨터가 기본 수준밖에 안 되는 사람들이 일본어로 많이 쓰이기 때문이다.
@iwadon씨의 조언에 따라 재제작되었습니다.
get_environment_variable.cpp
#include <cstdlib>
#include <string>
#include <stdexcept>
std::string get_environment_variable(const char* environment_name) {
    size_t buf;
    if (getenv_s(&buf, NULL, 0, environment_name)) throw std::runtime_error("read error");
    if (buf == 0) throw std::runtime_error("not such environment variable");
    getenv_s(&buf, buffer, buf, environment_name);
    return std::string(buffer);
}

사용 방법은 같다.
@yumetodo씨가 한층 더 편집을 진행했습니다.
get_environment_variable.cpp
#include <cstdlib>
#include <string>
#include <stdexcept>
std::string get_environment_variable(const char* environment_name) {
    size_t buf;
    if (getenv_s(&buf, NULL, 0, environment_name)) throw std::runtime_error("read error");
    if (buf == 0) throw std::runtime_error("not such environment variable");
    std::string buffer;
    buffer.resize(buf + 1);//reserve
    getenv_s(&buf, &buffer[0], buf, environment_name);
    buffer.resize(std::strlen(buffer.c_str()));//resize
    return buffer;
}
물론 사용법은 변하지 않는다.

좋은 웹페이지 즐겨찾기