더북(TheBook)

부록 K

errno_t getenv_s(size_t * restrict len,
                 char value[restrict],
                 rsize_t maxsize,
                 char const name[restrict]);

이 함수는 name에 해당하는 값이 환경 리스트에 있다면 char[maxsize] 타입인 value에 그 값을 복제한다. 물론 크기가 맞아야 한다. 이 값을 출력하는 방법은 다음과 같다.

void printenv(char const name[static 1]) {
  if (getenv(name)) {
    char value[256] = { 0, };
    if (getenv_s(0, value, sizeof value, name)) {
      fprintf(stderr,
              "%s: value is longer than %zu\n",
              name, sizeof value);
    } else {
      printf("%s=%s\n", name, value);
    }
  } else {
    fprintf(stderr, "%s not in environment\n", name);
  }
}

이 코드에서 볼 수 있듯이 환경 변수가 존재한다는 사실을 확인하고 나서 getenv_s에 첫 번째 인수를 0으로 설정하여 안전하게 값을 호출할 수 있다. 또한 타깃 버퍼인 value는 원하는 결과가 이 안에 들어갈 수 있을 때만 쓰게 된다. len 매개변수는 실제 길이를 감지하는 데 사용되며, 더 큰 값을 출력할 때는 동적 버퍼 할당을 적용할 수 있다. 이에 대한 자세한 설명은 뒤에서 소개한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.