부록 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 매개변수는 실제 길이를 감지하는 데 사용되며, 더 큰 값을 출력할 때는 동적 버퍼 할당을 적용할 수 있다. 이에 대한 자세한 설명은 뒤에서 소개한다.