C言語で環境変数を出力するプログラムの書き方
はじめに
この記事では、環境変数を一覧表示するC言語のプログラムを作成する方法を解説します。
環境変数(Environment Variable)とは、実行中のプロセスがシステム上でどのように振る舞うかに影響を与えることができるグローバル変数のことです。OSやアプリケーションの設定情報(パス、ユーザー名、システム構成など)が格納されており、プログラムから参照することで動作を柔軟に制御できます。
main関数の第3引数「envp」とは
通常、main関数は argc と argv の2つの引数を受け取りますが、実は第3引数として環境変数を受け取ることも可能です。
argc:コマンドライン引数の個数argv:コマンドライン引数の文字列配列envp:環境変数を指すポインタの配列(NULLで終端される)
envp は「名前=値」という形式の文字列へのポインタを要素とする配列で、配列の末尾は NULL で終わっています。そのため、NULL が出現するまでループ処理を行うことで、すべての環境変数を順番に出力できます。
環境変数を出力するサンプルプログラム
以下は、main関数の第3引数 envp を使って、システムに設定されているすべての環境変数を表示するプログラムです。
#include <stdio.h>
int main(int argc, char *argv[], char *envp[])
{
int i;
/* envp配列をNULLまで順に走査して出力 */
for (i = 0; envp[i] != NULL; i++)
printf("\n%s", envp[i]);
getchar();
return 0;
}コードのポイント
forループの継続条件をenvp[i] != NULLとすることで、環境変数の総数を事前に知らなくても自動的に最後まで処理できます。printf("\n%s", envp[i])により、1行に1つずつ環境変数が表示されます。getchar()は、コンソール画面がすぐに閉じないように入力待ちにしているだけなので、必須ではありません。
実行結果(出力例)
Windows環境で実行した場合の出力例は以下の通りです。実際に表示される内容は、実行環境や設定によって異なります。
ALLUSERSPROFILE=C:\ProgramData CommonProgramFiles=C:\Program Files\Common Files HOMEDRIVE=C: NUMBER_OF_PROCESSORS=2 OS=Windows_NT PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC PROCESSOR_ARCHITECTURE=x86 PROCESSOR_IDENTIFIER=x86 Family 6 Model 42 Stepping 7, GenuineIntel PROCESSOR_LEVEL=6 PROCESSOR_REVISION=2a07 ProgramData=C:\ProgramData ProgramFiles=C:\Program Files PUBLIC=C:\Users\Public SESSIONNAME=Console SystemDrive=C: SystemRoot=C:\Windows WATCOM=C:\watcom windir=C:\Windows
補足:特定の環境変数だけを取得したい場合
すべての環境変数ではなく、特定の環境変数の値だけが必要な場合は、標準ライブラリの getenv() 関数を使うと便利です。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *path = getenv("PATH");
if (path != NULL)
printf("PATH = %s\n", path);
else
printf("PATH は見つかりませんでした。\n");
return 0;
}getenv("環境変数名") は、指定した名前の環境変数が存在すればその値へのポインタを返し、存在しなければ NULL を返します。
まとめ
- main関数の第3引数
envpを使えば、すべての環境変数を簡単に一覧表示できる。 envp配列はNULLで終端されているため、ループ条件にenvp[i] != NULLを使う。- 特定の環境変数のみ取得したい場合は
getenv()関数が便利。
-
Cプログラムで行列を対角パターンに沿って数値出力する方法
この課題は、n×nの行列を対角パターンで出力することです。 例えば n が 3 の場合、対角パターンに従って行列を出力すると、次のような配置になります。 そして、実際の出力結果は以下の通りです。 実行例 Input: 3 Output: 1 2 4 3 5 7 6 8 9 Input: 4 Output: 1 2 4 7 3 5 8 11 6 9 12 14 10 13 15 16 考え方 一見すると、「数値 n を受け取り n×n の行列を生成し、それを対角方向に走査しながら別の行列へ値を格納する」というアプローチが思い浮かびます
-
環境変数を守る:APIキーやシークレットのためのセキュリティ対策ガイド
前回の記事「The Rubyists Guide To Environment Variables」では、環境変数システムの仕組みと、よくある誤解について解説しました。しかし、ある読者から「セキュリティについての言及が少ない」とのご指摘をいただきました。 現在では、秘密のAPIキーなどの重要な情報を環境変数に保存するのが一般的になっています。だからこそ、環境変数が持つセキュリティ上のリスクを正しく理解することが重要です。今回はそのポイントを見ていきましょう。 最悪のシナリオ ハッカーがroot権限、あるいはWebアプリケーションの所有ユーザーとしてサーバーへのアクセスに成功したと想像してくださ