C/C++のsystem()関数でできる驚きのテクニックとは?
この記事では、C言語やC++で使えるsystem()関数を活用して、ちょっとした驚きの動作を実現する方法を紹介します。
system()関数は、Windows・Linux・macOSなど主要なオペレーティングシステムに標準で用意されている関数です。この関数を使うと、通常はコマンドライン(コマンドプロンプトやターミナル)から入力するシステムコマンドを、C/C++のプログラム内から直接実行できるようになります。
system()関数とは?
system()関数は、cstdlibヘッダー(C言語ではstdlib.h)に定義されており、引数として渡した文字列をOSのコマンドとしてシェルに渡して実行します。戻り値としては、コマンドの終了ステータスが返されます。
例1:C++プログラムからIP設定情報を取得する
まず紹介するのは、Windowsのネットワーク設定情報を表示する「ipconfig」コマンドをC++プログラムから実行する例です。プログラムを実行するだけで、自分のPCのIPアドレスやサブネットマスクなどの詳細情報が取得できます。
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
system("C:\\Windows\\System32\\ipconfig");
}実行結果(出力例)
Windows IP Configuration Ethernet adapter Local Area Connection: Connection-specific DNS Suffix . : domain.name Link-local IPv6 Address . . . . . : fe80::302b:9dff:1cfb:ff01%10 IPv4 Address. . . . . . . . . . . : 192.168.2.6 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : fe80::217:7cff:fe3d:31c8%10 192.168.2.1 ...
このように、通常コマンドプロンプトで手入力しなければならないコマンドが、わずか数行のコードで自動実行できるのが分かります。
例2:C++プログラムからパソコンをシャットダウンする
次の例はさらに面白い使い方です。「shutdown」コマンドのパスをsystem()関数に渡すことで、プログラムの実行だけでコンピュータをシャットダウンさせることができます。
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
system("C:\\WINDOWS\\System32\\shutdown /s");
}実行結果
「システムがシャットダウンしようとしています」という通知ダイアログが表示され、その後コンピュータの電源が切られます。
注意点
shutdownコマンドのようにシステムに大きな影響を与える操作を含むため、system()関数を使う際は以下の点に注意しましょう。
- 実行するコマンドの内容を十分に確認し、誤った操作を防ぐ
- ユーザーの入力をそのままコマンドに渡すと、コマンドインジェクションのセキュリティリスクが生じる可能性がある
- OSによって利用できるコマンドやパスが異なるため、環境に応じた実装が必要
まとめ
system()関数を使えば、IP設定情報の取得やシャットダウンなど、OSのコマンドをC/C++プログラムから簡単に実行できます。アイデア次第でさまざまな自動化処理に応用できる便利な関数なので、ぜひ活用してみてください。
-
C++で学ぶ式ツリー(Expression Tree)の基本と具体例
式ツリーとは何か式ツリー(Expression Tree)とは、二分木の一種であり、木の各ノードが「演算子」または「オペランド(被演算子)」のいずれかで構成される特殊なデータ構造です。数式を木構造として表現することで、コンパイラや電卓アプリなどが数式を効率的に解析・評価できるようになります。ノードの役割式ツリーにおける各ノードは、次のように役割が分かれています。葉ノード(リーフノード):オペランド(数値や変数)を表します。非葉ノード(内部ノード):演算子(+、-、*、/ など)を表します。つまり、計算の対象となる値は必ず葉に配置され、それらをどのように処理するかを示す演算子が親ノードとして上に
-
C++で解く「3nスライスのピザ」問題 ― 動的計画法でスライスの合計を最大化する方法
問題の概要 大きさがまちまちの 3n 個のスライスからなるピザがあるとします。私と友人2人は、次のルールに従ってピザを取っていきます。 私が任意のスライスを1枚選びます。 友人のAmalは、私が選んだスライスの反時計回り方向に隣接するスライスを取ります。 友人のBimalは、私が選んだスライスの時計回り方向に隣接するスライスを取ります。 ピザのスライスがなくなるまで、この手順を繰り返します。 各スライスの大きさは、時計回りの順に並べた環状配列 slices として与えられます。求めるのは、私が手にできるスライスの大きさの合計の最大値です。 入出力例 入力が [9, 8, 6, 1, 1,