情報処理のWeb教科書―IPA情報処理試験対策のお供に!

C言語―フリーソフトのgccコンパイラで学ぶC言語入門

トップ プログラミング C言語

Windowsでも使えるフリーソフトのgccコンパイラで学ぶC言語入門用のオリジナルテキストをまとめています。フリーソフトのgccコンパイラのインストール方法や基本文法はもちろんですが、分割コンパイルやヘッダーファイルの作成方法など入門者にとって気になる内容もまとめています。

目次

この記事の目次です。

0. C言語とは

1. gccコンパイラのインストール

2. C言語の入門プログラムの作成

3. C言語の構文

4. 標準ライブラリの利用方法

5. ビルドとgccコンパイラーの使い方

参考)gccコマンドのオプション

更新履歴

0. C言語とは

C言語とは、コンピュータのプログラム言語の1つです。 プログラム言語はプログラミング言語ともいいます。

C言語とはどのようなプログラム言語か

C言語は、1972年に米国AT&T社ベル研究所のD.M.RitchieとB.W.Kernighanにより開発されたプログラム言語です。 OSやミドルウェアなどさまざまなソフトウェアの開発に使われています。

プログラム言語

プログラム言語とは、ソースプログラムの記述ルールのことをいいます。 プログラミング言語とも言います。C言語の他に、アセンブリ、C++、C#、Java、PHP、Python、Rubyなど多数あります。

なお、プログラム言語について詳しくは、詳細のページで解説しています。

詳細

C言語とコンパイラー

ソースプログラムは、コンピュータで実行できるプログラムのもととなる記述です。 C言語で記述したソースプログラムは人間がプログラムを記述するためのもので実際には動かすことはできません。

コンピュータでプログラムを動かすためにはコンピュータ用のコードに変換する必要があります。 変換にはコンパイラという変換プログラムを使用します。

C言語はコンパイラが必要
C言語はコンパイラが必要!

ソースファイルと実行形式ファイル

コンパイラでソースプログラムからコンピュータが実行できるプログラムに変換します。 ソースプログラムを記述したファイルをソースファイルといいます。 そして、ソースファイルをコンパイルしてできた実行可能なファイルのことを実行形式ファイルといいます。

1. gccコンパイラのインストール

前述のとおり、C言語のプログラムはC言語でプログラムを記述したファイル(ソースファイル)を作るだけでは動かすことはできません。 ソースファイルをコンパイラーでコンピュータが実行できる形式のファイルに変換する必要があります。

おすすめのコンパイラはgcc

どのコンパイラがおすすめかと悩みますが、 gccコンパイラは、メジャーなCコンパイラで、WindowsやLinuxなど複数のOSに対応しています。 実務にも使えますし、gccコンパイラを使って学習すると各種OSに対応したプログラムが作れます。 初心者の方がC言語に入門する場合はgccコンパイラがおすすめです。

初心者がC言語に入門する場合はWindows版のgcc

初心者がC言語に入門する場合はコマンドラインで使用するWindows版のgccがおすすめです。 いきなり高度な統合開発環境を使用するとコンパイル、リンクなどの仕組みがわかりにくくなるためです。

MinGWは Minimalist GNU for Windows"の略で、ネイティブのWindowsアプリケーションを開発するために必要な最小限の環境を提供するツールセットがまとめられています。

以降ではWindowsとLinux上にgccをインストールする方法を見ていきます。

Windows版のgccのMinGWのインストール

Windows版のgccのMinGWのインストール方法についてみていきます。

MinGWのダウンロード

http://www.mingw.org/へアクセスして「Download Installer」をクリックすると、 https://sourceforge.net/projects/mingw/files/latest/download?source=filesに遷移してインストーラのダウンロードが行われます。

MinGWのインストール

ダウンロードしてきたインストーラ「mingw-get-setup.exe」を実行し、そのまま既定値を選んでいって、MinGW Installation Managerのところでmingw32-baseとmingw32-gcc-g++を選択します。 選択したら、画面上部にあるメニューのInstallation>Apply Changesを実行します。

環境変数のPATHの設定

インストーラが終了したら、インストールフォルダ以外でツールが使用できるように環境変数のPATHの設定を行います。

MinGWのインストール先のbinフォルダのパスを環境変数のPATHに設定します。 インストール時にインストール先を変更していない場合は「C\MinGW\bin」をシステム環境変数のPATHの値の末尾に「;(セミコロン)」を付けて「;C\MinGW\bin」追加します。

Linux版のgccのインストール

Linux版のgccのインストール方法についてみていきます。

Debian系

UbuntsなどDebian系はopt-getでインストールできます。

$ sudo apt-get install gcc

CentOSなどRed Hat系

CentOSやFedraなどRed Hat Enterprise Linux系はyumでインストールできます。

$ sudo yum install gcc

参考)Linux

Linuxとは、WindowsやMacと同じOSの1つです。読み方はリナックスです。Linuxとはどのようなものかの説明を簡単にまとめています。 またネタとして使える日本産の軽量ディストリビューションのlinuxbeanの情報、コマンドラインの「$」「#」「cd」「~」記号の意味などの入門者にとってよくわからない点をわかりやすくまとめています。

詳細

2. C言語の入門プログラムの作成

C言語の簡単なプログラムが記述できるようにするため、初歩的な構文や制御構造について解説していきます。

以降でgccコンパイラを使用してC言語のプログラムの作成・実行を試していきます。 まずはソースファイルの作成から実行までの一連の流れをつかむために簡単なプログラムを作成して動かしていきます。 なお、特に断らない限りWindows版のgccの例を記載しています。

C言語のプログラムの作成の流れ

C言語のプログラムは、ソースコードを記述したソースファイルを作成し、ソースファイルのコンパイル(リンク)を行って実行形式ファイルを作成します。 そして、実行形式ファイルを起動することでプログラムが実行出来ます。

たとえば、作成から実行までは次のような流れになります。

  1. 拡張子が「.c」のテキストファイルにC言語のプログラムを記述します。 プログラムが記述されたファイルをソースファイルといいます。
  2. 「gcc ソースファイルのパス」のコマンドを実行して、ソースファイルをコンパイルします。 ソースファイルと同じディレクトリに、実行ファイルが作成されます。
  3. プログラムを実行します。

ここで作成するプログラムについて解説

ここではコマンドラインに「Hello World!!」と表示するプログラムを作成します。

ソースファイルの作成

Windowsに標準で搭載されているnotepadエディタを使用してソースファイルを作成します。

コマンドプロンプトを起動して、ファイル名を指定して、notepadコマンドを実行します。

notepad hello.c

以下のコードを入力して、保存します。

#include <stdio.h>

int main(void) {
	printf("Hello World!!\n");
	return 0;
}

プログラムについて解説

C言語のプログラムには、ヘッダーファイル宣言文、本体という構成要素があります。

ヘッダーファイル宣言文は、サンプルコードの#includeで始まる行のことで外部のファイルに実装された機能を使用する際に記述します。

本サンプルでは、printfというプロンプトに標準出力するための機能(関数)を使用するため、 stdio.hヘッダファイルを取り込む宣言を行っています。

本体は、int main(void) {~}のことを挿します。 実際の処理のロジックを記述します。

1つの処理の最後には「;」(セミコロン)をつける必要があります。

なお、C言語のコードでは文法のルール違反にならない範囲で空白や改行を自由に追加することができます。

コンパイル

dirコマンドでファイル一覧を表示すると「hello.c」のソースファイルが確認できます。

dir
hello.c

gccコマンドでコンパイルします。

gcc hello.c

dirコマンドでファイル一覧を表示して、a.exeという実行形式ファイルができていることを確認します。

a.exe  hello.c

プログラムの実行

a.exeと入力すると実行できます。

a.exe
Hello World!!

まとめ

今回はコマンドラインに「Hello World!!」と表示するプログラムを作成して、実行しながら、C言語のプログラムの書き方とコンパイルして実行する方法を見てきました。 ポイントをまとめます。

  1. プログラムは、コンピュータに特定の「仕事」を与えるものです。
  2. C言語では、テキストエディタなどのテキスト編集ツールで大文字と小文字に注意してソースコードを記述したソースファイルを作成します。
  3. ソースファイルのコンパイル(リンク)を行って実行形式ファイルを作成し、実行形式ファイルを実行することでプログラムが動きます。

C言語の入門プログラムの作成に関連した参考書籍

3. C言語の構文

簡単なプログラムなら自由に作成できるレベルを目指して、初歩的なC言語の基本文法、標準ライブラリの利用方法についてみていきます。

C言語のコードとコメント

C言語の入門知識として、はじめにC言語のソースコードはどのようなものか見てきます。

C言語のコード例

/* コメント1 */
#include <stdio.h>

int main(void){
	printf("Hello World!!\n");
	return 0; //コメント2
}

C言語の記述

実行形式ファイルの作成

C言語のコードは、C言語用のコンパイラを使用して、コンパイルを行って、実行できる形式の実行形式ファイルを作成します。

コンパイルする必要がある

C言語を使用する場合は、あらかじめコンパイルして実行形式ファイルを用意して、プログラムを利用します。

PHPやJavaScriptなどは異なる

なお、PHPやJavaScriptなどはソースプログラムを用意しておいて、実行するときにコンパイルが行われます。

C言語の変数の使用方法

プログラムのソースコードで扱われるデータを一定期間記憶して、必要なときに利用できるようにするため、 そのデータに固有の名前を付けて保管しておく仕組みがあります。

変数(へんすう、variable)は、プログラム内の名前を付けたデータの保管先のことを言います。 プログラム内でデータを保管して利用するために使用します。

データ型

変数には値を記憶させることができます。 この値には、いくつかの「種類」があります。 値の種類は、データ型(data type)、または型と呼ばれます。

C言語で文字(char)型のデータを変数で扱う方法

このページでは、C言語で文字(char)型のデータを変数で扱う方法について説明します。

サンプルソース

ソースフォルダに以下のサンプルコードを記述したテキストファイルを作成します。

サンプルコード(hello.c)
#include <stdio.h>
int main(void) {
	char c = 'H';
	printf("%c", c);

	c = 'e';
	printf("%c", c);

	c = 'l';
	printf("%c", c);

	c = 'l';
	printf("%c", c);

	c = 'o';
	printf("%c", c);

	c = '!';
	printf("%c", c);
	return 0;
}
サンプルコードについて

文字(char)型の値はシングルコーテーション(')で囲んで表現します。

サンプルコードでは、cという文字(char)型の変数に 'H'、'e'、・・・、'!'という文字を順番に設定(代入)して表示し、「Hello!」と出力しています。

printf関数にカンマ区切りで引数を2つしていしており、1つ目に%cを設定し、2つ目の引数で指定した変数cの値が出力されるようにしています。

コンパイル方法

コマンドプロンプトでソースファイルを保存したフォルダに移動しgccコマンドを実行してコンパイルします。

>cd test
>gcc hello.c

実行方法

a.exeというファイルができたフォルダにコマンドプロンプトで移動し、 a.exeとコマンドラインに入力すると「Hello!」と出力されます。

>a.exe
Hello!

C言語で整数(int)型のデータを変数で扱う方法

C言語で整数(int)型のデータを変数で扱う方法について説明します。

サンプルソース

ソースフォルダに以下のサンプルコードを記述したテキストファイルを作成します。

//ファイル名:sample.c

#include <stdio.h>

int main(void)
{
	int i = 0;
	printf("%d\n", i);

	i = 1;
	printf("%d\n", i);
	return 0;
}
サンプルコードについて

サンプルコードでは、iという整数(int)型の変数に 0、1という数を順番に設定(代入)して出力しています。

printf関数にカンマ区切りで引数を2つしていしており、1つ目に%dを設定し、2つ目の引数で指定した変数iの値が出力されるようにしています。

コンパイル方法

コマンドプロンプトでソースファイルを保存したフォルダに移動しgccコマンドを実行してコンパイルします。

>cd test
>gcc sample.c

実行方法

a.exeというファイルができたフォルダにコマンドプロンプトで移動し、 a.exeとコマンドラインに入力すると0と1の数字が改行されて出力されます。

>a.exe
0
1

C言語で配列

C言語で配列について見ていきます。

配列とは

配列とは、同じ種類のデータを、複数まとめて扱うことのできる変数です。

配列の宣言

配列は次のような書式で宣言します。

データ型 配列名[個数];

配列の例

ここではC言語で文字(char)型の配列を変数で扱う方法について説明しています。

サンプルソース

ソースフォルダに以下のサンプルコードを記述したテキストファイルを作成します。

//ファイル名:hello.c

#include <stdio.h>

int main(void) {
	char message[] = "Hello World!!";
	printf("%s\n", message);
	return 0;
}
サンプルコードについて

サンプルコードでは、messageという文字の配列(文字の型charの配列を示すため[]を付与)を格納する変数に「Hello World!!」という文字の配列(文字列)を初期値として設定(代入という)して 変数を宣言しています。

printf関数にカンマ区切りで引数を2つしていしており、1つ目に%sを設定し、2つ目の引数で指定した変数messageの値が出力されるようにしています。

コンパイル方法

コマンドプロンプトでソースファイルを保存したフォルダに移動しgccコマンドを実行してコンパイルします。

>cd test
>gcc hello.c

実行方法

a.exeというファイルができたフォルダにコマンドプロンプトで移動し、 a.exeとコマンドラインに入力すると「Hello World!!」と出力されます。

>hello
Hello World!!

C言語で配列に関連した参考書籍

C言語で配列に関連した参考書籍です。目次や参考いたしました内容をまとめています。

C言語の演算子

C言語の演算子の使用方法について見ていきます。

2=1+1のような計算式がある場合、=と+のような記号のことを演算子(operator)と呼びます。 ここではC言語の演算子についてまとめています。優先順位やノットイコール、アロー演算子についても解説していきます。

詳細

C言語の制御文の種類

プログラミングに無くてはならないのは制御文です。C言語の制御文の概要を見ていきます。

制御文とは

制御文とは、プログラムは上から下に実行されますが、途中で条件を分けたり、もとに戻ったりする制御を行う文を制御文といいます。

C言語の制御文には、if else、switch、while、for文などがあります。ここでは、if else、while、forの概要を見ていきます。

条件分岐(if、else)

if(A) {
    Bの処理;
} else if(C) {
    Dの処理;
} else {
    それ以外の場合の処理;
}

AならばBの処理、CならばDの処理のように条件に応じて、処理を分けるにはif文を使用します。条件により複数の処理がある場合はelse文を加えます。

繰り返し1(while)

while(条件) {
    条件が成立する間行う処理;
}

C言語で繰り返し処理を行う方法の1つにwhile文があります。

繰り返し2(for)

for(条件) {
    条件が成立する間行う処理;
}

C言語で繰り返し処理を行う方法の1つにfor文があります。 回数を設定する場合while文よりコードが短くなります。

C言語の制御文(分岐)の方法

C言語の制御文(分岐)の方法について説明しています。

条件によって処理が分岐する処理のことを分岐(と呼びます。 ここではC言語で分岐の方法について説明しています。

2方向分岐(if文)

Aであれば実行する、Aでなければ実行しないというような2方向の分岐を行う場合は、if文を使用します。

if文は「if(条件式) {処理A}」というように記述し、条件式が0以外の場合に処理Aが実行されます。

if文の条件式に単項式を用いる方法

C言語のif文の条件式に単項式を用いる方法について説明しています。

たとえば、aという変数のみのだけのような1つの項からなる式のことを単項式と言います。

サンプルソース

ソースフォルダに以下のサンプルコードを記述したテキストファイルを作成します。

//ファイル名:sample.c

#include <stdio.h>

int main(void) {
	int a;

	a=1;
	printf("%dは?", a);

	if (a) {
		printf("OK");
	}
	printf("\n");

	a=0;
	printf("%dは?", a);

	if (a) {
		printf("OK");
	}
	printf("\n");

	a=-1;
	printf("%dは?", a);

	if (a) {
		printf("OK");
	}
	printf("\n");

	return 0;
}
コンパイル方法

コマンドプロンプトでソースファイルを保存したフォルダに移動しgccコマンドを実行してコンパイルします。

>cd test
>gcc sample.c

実行方法

a.exeというファイルができたフォルダにコマンドプロンプトで移動し、 a.exeとコマンドラインに入力する以下のように表示されます。

>a.exe
1は?OK
0は?
-1は?OK

C言語の関数とは

関数とは、プログラムの記述として、何度も使用する命令のかたまりをまとめ、名前を付けたグループ化されたコードです。

「int a(){処理;}」のようにaという名前の関数を記述します。なお、C言語のmain関数はプログラムの開始時にはじめに実行される特別な関数になります。

関数の定義方法

関数はパラメータを引数で受け取り、return文で戻り値を呼び出し元にデータを返します。 データを返却しないものや引数がないものも定義できます。 なお、関数の引数や戻り値のデータ型もあらかじめ定義する必要があります。

戻り値の型 関数名(引数1,引数2…) {
retrun 戻り値;
}

引数と戻り値がある関数の例

引数と戻り値がある関数の例です。引数の値を足して、結果を戻り値に設定します。

#include <stdio.h>
int add(int a, int b) {
        return a + b;
}
int main(void) {
        printf("%d\n", add(1, 1));
        return 0;
}

引数と戻り値がない関数の例

以下は、引数と戻り値がない関数の例です。 引数はブランク、voidという型無しを表す型のキーワードを戻り値の型に設定します。 関数内でreturn文は省略できます。

#include <stdio.h>

void hello() {
        printf("Hello World!!\n");
}

int main(void) {
        hello();
        return 0;
}

プロトタイプ宣言

プロトタイプ宣言を行うと関数の定義をmain関数の後に記述できるようになります。 void hello();が関数のプロトタイプ宣言になります。 関数名と引数、戻り値が何かをあらかじめ知らせることでmain関数で使用するhello()関数が何かコンパイラー側が解決できるようになります。

#include <stdio.h>

void hello();

int main(void) {
        hello();
        return 0;
}

void hello() {
        printf("Hello World!!\n");
}

C言語の変数のスコープ

C言語のスコープ(変数)について見ていきます。

変数の宣言時に「記憶クラス指定子」を付けることで、変数のスコープを設定することができます。 また、変数がローカルかグローバルかにより変数の寿命を変えることができます。

表 変数のスコープ
種別 記憶クラス指定子 スコープ 寿命
ローカル変数 なし ブロック内 ブロック内
static ブロック内 プログラム終了まで
extern スコープ プログラム終了まで
グローバル変数 なし プログラム全体 プログラム終了まで
static ファイル単位 プログラム終了まで
extern プログラム全体 プログラム終了まで

C言語のコマンドライン引数

コマンドライン引数とは、プログラムをコマンドラインで実行する際にプログラムに引き渡すパラメータをいいます。 C言語のコマンドライン引数とは何か概要を見ていきます。

コマンドライン引数より文字列を受け取る例

受け取ったコマンドライン引数を表示してみます。

ソースコード
#include <stdio.h>

int main(int argc, char** argv) {
	int i;
	printf("引数の個数 = %d\n", argc);
	for (i = 0; i < argc; i++) {
		printf("引数%d = %s\n", i, argv[i]);
	}
	return 0;
}
コマンドライン引数の例

上記のコードをWindows用のコンパイラでコンパイルして実行した例です。

C:\sample>sample.exe 1 2 3
引数の個数 = 4
引数0 = C:\sample\sample.exe
引数1 = 1
引数2 = 2
引数3 = 3
argcに引数の数が設定される

argcに引数の数が設定され、上記のコードでは、4が設定されています。

argvには引数自体が設定される

argvに引数自体の値が文字列(char型の配列)の配列で格納されます。

argvはプログラム名から格納される

argvはプログラム名から格納されます。上記のコードでは、「C:\sample\sample.exe」が設定されています。

コマンドライン引数の数字の文字列を数値に変換する例

コマンドライン引数は、文字列となります。数値に変換して利用したい場合は変換が必要です。

ソースコード
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
	int i;
	printf("引数の個数 = %d\n", argc);
	for (i = 0; i < argc; i++) {
		printf("引数%d = %d\n", i, atoi(argv[i]));
	}
	return 0;
}
stdlib.hのatoi()で文字列を数値に

stdlib.hをインクルードして、atoi()を使用することで文字列を数値に変換できます。

C:\sample>sample.exe 1 2 3
引数の個数 = 4
引数0 = C:\sample\sample.exe
引数1 = 1
引数2 = 2
引数3 = 3
atoi()に数字以外の文字

atoi()に数字以外の文字列が設定されると「0」となります。

C:\sample>sample.exe a b c
引数の個数 = 4
引数0 = C:\sample\sample.exe
引数1 = 0
引数2 = 0
引数3 = 0

ポインタ

C言語のポインタの宣言方法について見ていきます。

ポインタ変数は、変数の場所(アドレス)を記憶する変数です。 ポインタ変数はまずはじめに変数のアドレスを代入して初期化しなければなりません。

ポインタ変数に変数のアドレスを代入してはじめて、ポインタの指すアドレスを見たり、そのアドレスの変数に記憶してある値を操作することができます。 ここではC言語のポインタについてまとめています。宣言方法から構造体ポインタまで解説していきます。

詳細

4. 標準ライブラリの利用方法

printf関数

printf関数は、print formattedの略でプリントエフと呼びます。 C言語の標準入出力ヘッダー (stdio.h)で宣言されている関数で、引数で与えられた書式付きの文字列を、環境によって設定された標準出力(stdout)に出力します。

printf関数(書式付出力)に第1引数のみ指定して文字列を出力する方法

stdio.hのprintf関数(書式付出力)に第1引数のみ指定して文字列を出力する方法について説明しています。

サンプルソース

ソースフォルダに以下のサンプルコードを記述したテキストファイルを作成します。

//ファイル名:hello.c

#include <stdio.h>

int main(void) {
	printf("Hello World!!");
	return 0;
}
コンパイル方法

コマンドプロンプトでソースファイルを保存したフォルダに移動しgccコマンドを実行してコンパイルします。

>cd test
>gcc hello.c

実行方法

a.exeというファイルができたフォルダにコマンドプロンプトで移動し、 a.exeとコマンドラインに入力すると「Hello World!!」と出力されます。

>a.exe
Hello World!!

printf関数(書式付出力)で改行を追加する方法

このページでは、stdio.hのprintf関数(書式付出力)で改行を追加する方法について説明しています。

printf関数で「\n」を追加することで文字列に改行が追加できます。。

サンプルソース

ソースフォルダに以下のサンプルコードを記述したテキストファイルを作成します。

//ファイル名:hello.c

#include <stdio.h>

int main(void) {
	printf("Hello World!!\nHello World!!");
	return 0;
}
コンパイル方法

コマンドプロンプトでソースファイルを保存したフォルダに移動しgccコマンドを実行してコンパイルします。

>cd test
>gcc hello.c

実行方法

a.exeというファイルができたフォルダにコマンドプロンプトで移動し、 a.exeとコマンドラインに入力すると「Hello World!!」が改行されて2回出力されます。

>a.exe
Hello World!!
Hello World!!

printf関数(書式付出力)で変換指定子(%c)を使用して文字を出力する方法

stdio.hのprintf関数(書式付出力)で変換指定子(%c)を使用して文字を出力する方法について説明しています。

変換指定子(%c)を使用することで変数の値の文字を出力することができます。

サンプルソース

ソースフォルダに以下のサンプルコードを記述したテキストファイルを作成します。

//ファイル名:hello.c

#include <stdio.h>

int main(void) {
	char c = 'H';
	printf("%c", c);

	c = 'e';
	printf("%c", c);

	c = 'l';
	printf("%c", c);

	c = 'l';
	printf("%c", c);

	c = 'o';
	printf("%c", c);

	c = ' ';
	printf("%c", c);

	c = 'W';
	printf("%c", c);

	c = 'o';
	printf("%c", c);

	c = 'r';
	printf("%c", c);

	c = 'l';
	printf("%c", c);

	c = 'd';
	printf("%c", c);

	c = '!';
	printf("%c", c);

	c = '!';
	printf("%c", c);
	return 0;
}
サンプルコードについて

文字(char)型の値はシングルコーテーション(')で囲んで表現します。

サンプルコードでは、cという文字(char)型の変数に 'H'、'e'、・・・'d'、'!'、'!'という文字を順番に設定(代入)して表示し、「Hello World!!」と出力しています。

printf関数にカンマ区切りで引数を2つしていしており、1つ目に%cを設定し、2つ目の引数で指定した変数cの値が出力されるようにしています。

コンパイル方法

コマンドプロンプトでソースファイルを保存したフォルダに移動しgccコマンドを実行してコンパイルします。

>cd test
>gcc hello.c

実行方法

a.exeというファイルができたフォルダにコマンドプロンプトで移動し、 a.exeとコマンドラインに入力すると「Hello World!!」と出力されます。

>a.exe
Hello World!!

printf関数(書式付出力)で変換指定子(%d)を使用して整数を出力する方法

stdio.hのprintf関数(書式付出力)で変換指定子(%d)を使用して整数を出力する方法について説明しています。

変換指定子(%d)を使用することで変数の値の整数を出力することができます。

サンプルソース

ソースフォルダに以下のサンプルコードを記述したテキストファイルを作成します。

//ファイル名:sample.c

#include <stdio.h>

int main(void) {
	int i = 0;
	printf("%d\n", i);

	i = 1;
	printf("%d\n", i);
	return 0;
}
サンプルコードについて

サンプルコードでは、iという整数(int)型の変数に0、1という数を順番に設定(代入)して出力しています。

printf関数にカンマ区切りで引数を2つしていしており、1つ目に%dを設定し、2つ目の引数で指定した変数iの値が出力されるようにしています。

コンパイル方法

コマンドプロンプトでソースファイルを保存したフォルダに移動しgccコマンドを実行してコンパイルします。

>cd test
>gcc sample.c

実行方法

a.exeというファイルができたフォルダにコマンドプロンプトで移動し、 a.exeとコマンドラインに入力すると0と1の数字が改行されて出力されます。

>a.exe
0
1

printf関数(書式付出力)で変換指定子(%s)を使用して文字列を出力する方法

stdio.hのprintf関数(書式付出力)で変換指定子(%s)を使用して文字列を出力する方法について説明しています。

変換指定子(%s)を使用することで変数の値の文字列を出力することができます。

サンプルソース

ソースフォルダに以下のサンプルコードを記述したテキストファイルを作成します。

//ファイル名:hello.c

#include <stdio.h>

int main(void) {
	char message[] = "Hello World!!";
	printf("%s\n", message);
	return 0;
}
サンプルコードについて

サンプルコードでは、messageという文字列(文字の型charの配列を示すため[]を付与)の変数に「Hello World!!」という文字列を初期値として設定(代入という)して変数を宣言しています。

printf関数にカンマ区切りで引数を2つしていしており、1つ目に%sを設定し、2つ目の引数で指定した変数messageの値が出力されるようにしています。

コンパイル方法

コマンドプロンプトでソースファイルを保存したフォルダに移動しgccコマンドを実行してコンパイルします。

>cd test
>gcc hello.c

実行方法

a.exeというファイルができたフォルダにコマンドプロンプトで移動し、 a.exeとコマンドラインに入力すると「Hello World!!」と出力されます。

>a.exe
Hello World!!

fgets関数

C言語のfgets関数は、ファイルの内容を1行読み取る機能がある関数です。

早速、C言語のfgets関数の使い方を見ていきます。

fgets関数のプロトタイプ宣言

fgets関数のプロトタイプ宣言は以下です。

char *fgets(const char *s, int size, FILE *stream);

ファイルポインタ(FILE *stream)で表されるファイルから1行分をバッファ(char *s)へ読み込みます。 ここでの1行は改行がでてくるまでで、バッファには改行も含まれます。

fgets関数の使い方の例

C言語のサンプルコード例を見ながら、具体的にfgets関数の使い方を見ていきます。

以下はfgets関数を用いたC言語のサンプルコードです。

#include <stdio.h>

int main(void) {
    FILE *fp;
    char s[15];
    fp = fopen("readfile.txt", "r");

    if (fp == NULL) {
        printf("file open errer.\n");
        return 1;
    }
    fgets(s, 15, fp);
    fclose(fp);
    printf("%s", s);
    return 0;
}
サンプルソースのコンパイル

サンプルコードをコンパイラでコンパイルして実行してみます。

gcc sample.c
実行

たとえば、以下のように改行を含む文字列をreadfile.txtに記述して置きます。

Hello World!!

実行してみると改行を含む文字列が表示されます。

a.exe
Hello World!!

fputs関数

標準Cライブラリ関数のfputs(stdio.h)について見ていきます。

fputs関数を使用することでファイルに1行出力することができます。

サンプルコード(sample.c)

#include <stdio.h>

int main(void) {
    FILE *fp;
    fp = fopen("outputfile.txt", "w");

    if (fp == NULL) {
        printf("file open errer.\n");
        return 1;
    }

    fputs("Hello World!!\n", fp);
    fclose(fp);
    return 0;
}

コンパイル

gccを使用してコンパイルする例を示します。

gcc sample.c

実行

a.exe

実行すると「outputfile.txt」というファイルができます。 ファイルの中には「Hello World!!」と出力されます。

5. ビルドとgccコンパイラーの使い方

ソースコードから実行形式ファイルを作成するまでのコンパイルやリンクなどの過程をビルドといいます。 ここではビルド関連の知識およびgccコンパイラーの使い方について掘り下げていきます。

分割コンパイル

複数のソースファイルから分割コンパイルして1つの実行形式ファイルする方法について見ていきます。

分割コンパイルの流れ

分割コンパイルの流れは以下のようになります。

  1. コーディング(ソースファイル作成)
  2. オブジェクトファイルの作成(単一ファイルのコンパイル)
  3. 実行形式ファイルの作成(オブジェクトファイルのリンク)

分割コンパイルの実施例

分割コンパイルの実施例です。

コーディング(ソースファイル作成)

以下の2つのソースファイルを作成します。

Main.c
#include <stdio.h>

void hello();

int main(void) {
        hello();
        return 0;
}
Hello.c
#include <stdio.h>

void hello() {
        printf("Hello World!!\n");
}
オブジェクトファイルの作成(単一ファイルのコンパイル)

それぞれのファイルをgccの-cオプションでコンパイルして.oファイルを作成します。

gcc -c Main.c
gcc -c Hello.c
実行形式ファイルの作成(オブジェクトファイルのリンク)

gccの-oオプションで2つのMain.oとHello.oファイルをリンクして実行形式ファイルを作成します。

gcc Main.o Hello.o -o sample.exe
サンプルの実行

作成したsample.exeを実行するとHello World!!と表示されます。

sample.exe
Hello World!!

ヘッダーファイルの作成方法

C言語のヘッダ―ファイルの作成方法について見ていきます。

ヘッダーファイルとは

ヘッダーファイルとは、関数のプロトタイプ宣言などの記述をまとめたファイルのことを言います。 複数のソースファイルで同じ#include文を記述したりする場合に便利です。

ヘッダーファイルの使い方

#include文で「#include <stdio.h>」や「#include "hello.h"」のように記述して使用します。 標準ライブラリのヘッダーファイルは「<」「>」を使用し、ユーザ定義のヘッダーファイルは「"」「"」を使用してヘッダーファイルを指定します。

ヘッダーファイルの作成例

ヘッダーファイルの作成例です。

コーディング(ヘッダーファイルの作成)

まずは以下のヘッダーファイルを作成します。

sample.h
#ifndef SAMPLE_H
#define SAMPLE_H

#include <stdio.h>
void hello();

#endif

上記のように#include文や関数のプロトタイプ宣言などを記述します。 また、多くの場合、同じものを何度も読み込まないようにする工夫として、「#ifndef ~ #endif」マクロを使用します。

コーディング(ソースファイル作成)

以下の2つのソースファイルを作成します。

Main.c
#include "sample.h"

int main(void) {
        hello();
        return 0;
}
Hello.c
#include "sample.h"

void hello() {
        printf("Hello World!!\n");
}
オブジェクトファイルの作成(単一ファイルのコンパイル)

sample.hと同じフォルダにソースファイルを配置し、 それぞれのファイルをgccの-cオプションでコンパイルして.oファイルを作成します。

gcc -c Main.c
gcc -c Hello.c
実行形式ファイルの作成(オブジェクトファイルのリンク)

gccの-oオプションで2つのMain.oとHello.oファイルをリンクして実行形式ファイルを作成します。

gcc Main.o Hello.o -o sample.exe
サンプルの実行

作成したsample.exeを実行するとHello World!!と表示されます。

sample.exe
Hello World!!

目次 / 戻る

参考)gccコマンドのオプション

gccコマンドのオプションは--helpオプションで確認できます。以下はその出力になります。

> gcc --help
Usage: gcc [options] file...
Options:
  -pass-exit-codes         Exit with highest error code from a phase
  --help                   Display this information
  --target-help            Display target specific command line options
  --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]
                           Display specific types of command line options
  (Use '-v --help' to display command line options of sub-processes)
  --version                Display compiler version information
  -dumpspecs               Display all of the built in spec strings
  -dumpversion             Display the version of the compiler
  -dumpmachine             Display the compiler's target processor
  -print-search-dirs       Display the directories in the compiler's search path
  -print-libgcc-file-name  Display the name of the compiler's companion library
  -print-file-name=<lib>   Display the full path to library <lib>
  -print-prog-name=<prog>  Display the full path to compiler component <prog>
  -print-multiarch         Display the target's normalized GNU triplet, used as
                           a component in the library path
  -print-multi-directory   Display the root directory for versions of libgcc
  -print-multi-lib         Display the mapping between command line options and
                           multiple library search directories
  -print-multi-os-directory Display the relative path to OS libraries
  -print-sysroot           Display the target libraries directory
  -print-sysroot-headers-suffix Display the sysroot suffix used to find headers
  -Wa,<options>            Pass comma-separated <options> on to the assembler
  -Wp,<options>            Pass comma-separated <options> on to the preprocessor
  -Wl,<options>            Pass comma-separated <options> on to the linker
  -Xassembler <arg>        Pass <arg> on to the assembler
  -Xpreprocessor <arg>     Pass <arg> on to the preprocessor
  -Xlinker <arg>           Pass <arg> on to the linker
  -save-temps              Do not delete intermediate files
  -save-temps=<arg>        Do not delete intermediate files
  -no-canonical-prefixes   Do not canonicalize paths when building relative
                           prefixes to other gcc components
  -pipe                    Use pipes rather than intermediate files
  -time                    Time the execution of each subprocess
  -specs=<file>            Override built-in specs with the contents of <file>
  -std=<standard>          Assume that the input sources are for <standard>
  --sysroot=<directory>    Use <directory> as the root directory for headers
                           and libraries
  -B <directory>           Add <directory> to the compiler's search paths
  -v                       Display the programs invoked by the compiler
  -###                     Like -v but options quoted and commands not executed
  -E                       Preprocess only; do not compile, assemble or link
  -S                       Compile only; do not assemble or link
  -c                       Compile and assemble, but do not link
  -o <file>                Place the output into <file>
  -pie                     Create a position independent executable
  -shared                  Create a shared library
  -x <language>            Specify the language of the following input files
                           Permissible languages include: c c++ assembler none
                           'none' means revert to the default behavior of
                           guessing the language based on the file's extension

Options starting with -g, -f, -m, -O, -W, or --param are automatically
 passed on to the various sub-processes invoked by gcc.  In order to pass
 other options on to these processes the -W<letter> options must be used.

For bug reporting instructions, please see:
<http://gcc.gnu.org/bugs.html>.

更新履歴

戻る

スポンサーリンク

情報処理の知識体系

プログラミング

各試験の問題と解説

ランダム出題・採点アプリ

スポンサーリンク