Linuxゲリラ戦記

正直に言うと、C言語をするのが7年ぶりくらいで、すでに忘れていたのでググりながら今回のコードを書いた。

75.C言語で初めてのプログラミング

ナックス「今日はC言語で初めてコードを書いて、実行するまでをやりましょう」

デビー君「はーい」

ナックス「C言語って聞くと、なんだか凄そうに聞こえるけど、シェルスクリプトと同じく、コードは普通のテキストエディタで書けます。できればvimでコードを書いて欲しいですが、『vim苦手』って人はnanoで書いてもいいよ」

デビー君「はーい」

ナックス「というわけで、CUI環境を立ち上げて」

CUI環境を立ち上げる

ナックス「今回はmoji.cというファイル名でC言語のコードを書くことにしましょう」

$ vim moji.c

moji.cというファイル名でファイルを作成する

Vimが起動する

ナックス「iキーを押して挿入モードにしてから」

Vimを挿入モードにする

ナックス「以下のように記述してください」

#include <stdio.h>

void main()
{
	printf("あなたご飯にする?");
	printf("お風呂にする?\n");
	printf("それとも、タ・ワ・シ?");
}

C言語のコードを記述する

ナックス「こちらは、『あなたご飯にする?お風呂にする?それともタ・ワ・シ?』という文字を表示するプログラムです」

デビー君「タワシを選ぶとどうなるの?」

ナックス「『お風呂にする?』の最後にだけ\nというのがあるので、忘れずに記述してね。また\nの\はキーボードの¥キーを押せば入力できるんだけど、使用しているLinuxディストリビューションによって¥キーを押すと(実際には半角の)\のように表示されたり(実際には半角の)¥のように表示されたりします。でも、プログラムの実行には影響がないから(実際には半角の)¥nのように表示されようが(実際には半角の)\nのように表示されようが問題は無いよ」

ナックス「また、コピペ(コピー&ペースト)じゃなくて、できるだけ自分でコードを書いてね。せっかくのプログラミングの勉強だからね」

ナックス「書き写している途中で何か分からないことがあったら、このページ下部の補足を参考にしてみてください」

ナックス「書きましたか?」

デビー君「書きました!」

ナックス「では、Escキーを押してコマンドモードにしたあと、」

Vimをコマンドモードにする

ナックス「:wqと入力して」

:wq

保存とvimの終了を同時に行う

ナックス「Enterキーを押すことで、保存とVimの終了を行います」

保存とvimの終了

ナックス「これでコードの記述は完了です」

ナックス「では、引き続き今度はコンパイラ(前回インストールしたgcc)を使用して、このコードのコンパイル(機械語に変換する)を行います」

デビー君「はい」

ナックス「コンパイル、と聞くと難しそうですが、実はgccコマンドで出来ます。以下のようにコマンドを打ってください」

$ gcc moji.c -o moji

Cコードのコンパイル

Cコードのコンパイルの終了

ナックス「エラーが出なければ、記述したコードに問題がなかったということです。コンパイルした時に、エラーっぽいやつが出た場合は、コードの記述をどこか間違えています。泣きながら自分が書いたコードを見なおしてみてね」

ナックス「実行後に、lsコマンドを使用してみてください。moji.cを機械語に変換したあとのファイル(実行可能ファイル)、mojiが作成されています」

$ ls
moji moji.c

mojiが出来てる

ナックス「これは、gccコマンド使用時に、-oオプションで、コンパイル後のファイル名を指定したからです。なので、例えば」

$ gcc moji.c -o hogehoge

ナックス「とすると、mojiではなくhogehogeが出来るし、」

$ gcc moji.c -o fugafuga

ナックス「とすると、mojiではなくfugafugaが出来ます。自分で趣味でプログラムを作成する場合は、好きな名前をつけていいのですが、基本的には作成したソースコード(今回はmoji.c)と同じ名前をつけるようです。ちなみに、-oオプションを指定しないでgccコードを使用した場合は」

$ gcc moji.c

ナックス「a.outという名前で実行可能ファイルが作成されます」

ナックス「というわけで、作成した実行可能ファイルを実行してみましょう。これも、シェルスクリプトの時と同じように、以下のように入力してEnterキーを押すことで実行できます。」

$ ./moji
あなたご飯にする?お風呂にする?
それともタ・ワ・シ? $ 

mojiを実行する

デビー君「うわ!実行すると、なんか表示が崩れている気がする!」

ナックス「いいえ。計算通りです。なんか、次にコマンドを打つ場所が中途半端なところにあって気持ちが悪い、っていう方は、何も入力せずにEnterキーを押すことで、」

$ ./moji
あなたご飯にする?お風呂にする?
それともタ・ワ・シ? $ 
$ 

ナックス「気持ち悪いのが、ちょっと治ります。というわけで次回、76.前回作ったC言語プログラムの解説!」

補足

コードの#はどのキーを押せば入力できますか?

Shiftキーを押しながら、このキーを押してください。

シャープキー

コードの<はどのキーを押せば入力できますか?

Shiftキーを押しながら、このキーを押してください。

山カッコ

コードの>はどのキーを押せば入力できますか?

Shiftキーを押しながら、このキーを押してください。

谷カッコ

コードの(はどのキーを押せば入力できますか?

Shiftキーを押しながら、このキーを押してください。

丸カッコ開始

コードの)はどのキーを押せば入力できますか?

Shiftキーを押しながら、このキーを押してください。

丸カッコ終了

コードの{はどのキーを押せば入力できますか?

Shiftキーを押しながら、このキーを押してください。

中カッコ開始

コードの}はどのキーを押せば入力できますか?

Shiftキーを押しながら、このキーを押してください。

中カッコ終了

コードの"はどのキーを押せば入力できますか?

Shiftキーを押しながら、このキーを押してください。

ダブルクオーテーション

コードの;はどのキーを押せば入力できますか?

このキーを押してください。

セミコロン

\nの\はどのキーを押せば入力できますか?

このキーを押してください。

バックスラッシュ

コードのどこを半角英数で記述して、どこを全角で記述するべきですか?

「あなたご飯にする?」「お風呂にする?」「それともタ・ワ・シ?」のみ全角文字で入力して、それ以外は半角文字で入力してください。また、文字の半角全角の切り替えは、キーボードの下記のボタンを押下することで行えます。

半角全角切り替え

「それともタ・ワ・シ?」の「・」はどのキーを押せば入力できますか?

このキーを押してください。

中黒

コードのprintfの左側に、スペースが空いている気がします。

はい。空けています。こちらは、コードを見やすくするためのものであり、実際にはスペースを空けなくても、プログラムの実行には問題ありません。こちらのスペースは、一般的にはタブキーで空けますが、スペースキーで空けても問題ありません。

スペースを空ける

Vimのコマンドモードの:wqってなんでしたっけ?

Vimのコマンドモードで:wと入力してEnterキーを押すことで、ファイルの保存。:qと入力してEnterキーを押すことでVimの終了を行えます。また、:wqと入力してEnterキーを押すことで、ファイルの保存とVimの終了を同時に行えます。ちなみに:w!と入力してEnterキーを押すことで、ファイルの強制保存、:q!と入力してEnterキーを押すことで、Vimの強制終了の意味になります。一応覚えておいてください。

Vimの開始時に、「スワップファイルがなんたらかんたら」みたいな文字が表示されるようになってしまいました。助けて!

Vimを正しくない方法で終了すると、「スワップファイル」という名前で、作業中のファイルのバックアップファイルが作成されます。もし、Vimでファイルを作成して作業しようとした際に、以下の様な表示がされたら

スワップファイルが存在する

キーボードのQを押下してVimを終了させた後、

Qキーを押す

ls -aコマンドを打ってみてください。作業しようとしたファイルのスワップファイルが存在することが確認できます。

$ ls -a

スワップファイルの存在を確認する

スワップファイルは「.[作業しようとしたファイルのファイル名].swp」というファイル名で作成されています(今回の例では.moji.c.swpというファイル名)。スワップファイルに関しては、いつか改めて解説しますので、今のところは単純に、対象のスワップファイルを削除してください。

$ rm [対象のスワップファイル]

つまり、今回の例ではこうです。

$ rm .moji.c.swp

スワップファイルを削除する

これで、Vimで普通にファイルを開いて作業できるようになります。

$ vim moji.c

Vimが使える

Vimが使える2

なんか、実行形式ファイルが作成されないんだけど?

コンパイルしても実行形式ファイルが作成されないなら、そもそもコンパイルに失敗しています。たぶん、コードの記述をどこか間違えてますよ。

実行形式ファイルがなぜか実行できないんだけど。

ちゃんと実行権限ついてる?ついてないようだったらchmodコマンドを使って実行権限をつけてね。

「fatal error stdio.hというファイルまたはディレクトリはありません」と表示される場合

すいません。メールで問い合わせがありまして、「コンパイルしようとしたら『fatal error stdio.hというファイルまたはディレクトリはありません』と表示され、libc6-devをインストールしたらコンパイルできたので、これについて解説して欲しい」との連絡を頂いたので、補足をば。

まず、aptitudeコマンド、もしくはapt-cacheコマンドでgccパッケージの詳細を見ていただきたい。例えばaptitudeコマンドでgccパッケージの詳細を見たい場合は

$ aptitude show gcc

aptitudeコマンドでgccパッケージの詳細を見る

apt-cacheコマンドでgccコマンドの詳細を見るには以下です

$ apt-cache show gcc

apt-cacheコマンドでgccパッケージの詳細を見る

で、コマンドの実行結果で赤い矢印で示したところを見て欲しいのですが「推奨(またはRecommends)」という表示があります。

推奨: libc6-dev | libc-dev

これは、「gccをインストールするなら、libc6-devとlibc-devもインストールすることを推奨するよ」という意味になります。しかも、推奨をインストールしないと、コマンドがうまく動かないことさえあります。おのれLinux!

そして、私の知識が確かならば、aptitudeコマンドは、「推奨」となっているパッケージも、勝手に一緒にインストールしてくれます。対して、apt-getコマンドは一緒にインストールしてくれません。さらに、Debianは、通常のパッケージの管理にはaptitudeコマンドを使用することを勧めており、apt-getコマンドは、Debianのバージョンアップ(Debian7からDebian8にするとか)という、巨大な更新を行う場合のみ使用することを勧めています。頂いたメールによると、問い合わせた方はLinux Mintを使用しているそうなので、Linux MintといえばUbuntu派生。UbuntuといえばDebian派生。つまり、aptitudeコマンドを使えるはず。なので、おそらく、最初のgccコマンドをインストールする際にaptitudeコマンド以外の方法でgccをインストールしたのではないだろうか……。というわけで、今後はaptitudeコマンドでパッケージをインストールすることをお勧めします。ちなみに「私のLinuxはDebian系だけど、aptitudeコマンド無いんだよね……」っていう方は、多分apt-getコマンドでaptitudeコマンドをインストールできると思う。

# apt-get install aptitude

ちなみに、問い合わせメールに「失敗した時に/usr/lib/syslinux/com32/にstdio.hがあったので、こちらを使用しようとしたら失敗したので、こちらも何なのか教えて欲しい」と言われたのですが、すまぬ。分からぬ。信じて欲しい。確かに私はLinux解説サイトをやっているけど、特にLinuxのスペシャリストなのではなく、単に趣味でLinuxを使用しているだけなんだ。だから……本当に……純粋に……わからないんだ……。#だめじゃん

他にもこの解説で分からないことがある方がいましたら、遠慮無くお問い合わせください。

このエントリーをはてなブックマークに追加