Cの基本的な知識


さて、C言語を使ってKeyGenを作るに当たって、最低覚えておかなくてはならない事を勉強します。

初めは、Borland C++ Compiler 5.5というコンパイラで話を進めていきます。

持っていない方は、フリーのコンパイラBorland C++ Compiler 5.5(以下BCC)をDLして下さい。
次にCPad for Borland C++CompilerもDLして下さい。

まず、BCCをインストールします。
DLしたファイルを実行して「同意」→「完了」して下さい。
パスなどは、解らなければデフォルトのままにしておいて下さい。

次にCPadを解凍します。解凍したら、その中の、bcpad.exeと、言うのを実行して下さい。
まず設定画面が現れます。

まず、コンパイラのパス(W)を設定します。参照を押してbcc32.exeを探します。
デフォルトでインストールしたかたは、「C:\borland\bcc55\Bin\bcc32.exe」に有ると思いますので
その場所を探して下さい。
もしくは、直接入力しても構いませんが、確認のため入力した後参照を押してみて下さい。
参照で選んだ方は、自動的に「設定ファイルの自動設定をします」と出てくると思いますので「はい」を押して下さい。
ヘルプファイルのパスは、入力しなくて良いですが、気になる方はbcb5tool.hlpを探して下さい。
C:\borland\bcc55\Help\bcb5tool.hlp」(デフォルトでインストした場合)を入れて下さい。
ファイル保存時に自動的にバックアップを取るは、どちらでもイイです。
あとの設定は、解らなければいじらないで下さい。デフォルトのままでも大丈夫です。
いつでもメニューの「実行」→「設定」で変更できるので上記の必須の部分だけ設定して下さい。

設定が終わると以下のような画面が現れます(サイズは変えてあります)

ファイル(F) 編集(E) 表示(V) 実行(R)・・・と並んでいる部分がメニューです。
何かしたいことがあったりしたら、ここを探して下さい。



これは左から

「新規作成」「ファイルを開く」「保存」
「make or コンパイル」「make or コンパイル 後実行」
「検索」「下検索」「上検索」
「切り取り」「コピー」「貼り付け」

です。これはツールバーと言って、メニューの表示で出したり消したり出来ます。
これが使いやすい方は、使って下さい。私は消しますのでこの後は、出てきません。

コマンドと書かれている部分は、コマンドプロンプト(DOS窓)に送るコマンドを書く部分です。
その横の実行は、コマンドプロンプトを実行します。
私はコレも使わないので、消します。

上記の私の設定は、全部使わないので
メニューの「表示(V)」→「ツールバー」→「全体」のチェックをはずすだけで出来ます。

私の環境はこんな感じです。

さて、その下の 

1|[EOF]

と書かれている部分があります。
ここにプログラム自体のC言語のソースファイルを書きます。

その下のメッセージと出ている部分は、コンパイルした時のエラーなどの情報が出ます。

まずは、C言語のプログラムの基本で、何もしないプログラムです。
実行できるが何もしないと言うことです。
基本となる部分なので覚えて下さい。

そして、以下の文を書きます。


int main(){
        return 0;
}

画面はこんな感じです。(次からはでません)

下のメッセージは、コンパイルすると出てきます。
(色が違うと思われたかもしれませんが、
これは、メニューの「実行」→「設定」→「キーワード」の「色変更(C)」で出来ます。
デフォが嫌なら、自分で変えて下さい。)

書き終えたら、まず保存します。
ツールバーが有る方は、ディスクの絵を、無い方は、メニューの「ファイル」→「上書き保存」で出来ます。
上書き保存は、まだ一度も保存していない場合は、新規の保存となります。
([CTRL+S]でも、できます。)
そして、コンパイルします。ツールバーがある人は、左から4番目を(5なら実行もします。)
無いひとは、メニューの「実行」→「コンパイル」です。


(コンパイルは[CTRL+F8]、実行は[SHIFT+F8]、コンパイル後に実行はF8でもできます。)

これで、何もしないプログラムのできあがりです。
ついでに、全角スペースは使えないので覚えておいて下さい。

エラーが出なかったら、実行しましょう。
何もしませんが、実行できますね。


説明をしますと、int main() は、プログラム本体のソースを書く部分です。
{} の間にプログラムを書いていきます。
たまに、void main() と言うのを見ますが、どうやらmain()voidを言うことは、本当は無いようです。
voidでもかまいませんが。。。
voidの場合だと、return 0;は必要有りません。
(この場合何も書かなくていいですが、途中で抜ける場合はreturn;と書きます。)

int main()intは、正数を返すという意味です。
voidの場合は、何も返しません。
最初は、意味がわからないでしょうが、後々わかってきます。
こう書くと覚えておいて下さい。

returnと言うのは、関数から抜ける命令です。
(main()の中で書くとプログラムの終了と言うことになります。)
その時に、何を返すかと言うのを後ろに書きます。
最後のセミコロン ';' は、命令の終わりを伝えています。
Cは、一つの命令が数行にまたがったりすることもありますので、教えなければなりません。
コレを忘れるとエラーになります。
一つの命令ごとにきちっとセミコロンを入れて下さいね。



さて、KGと言えばパスを表示させなくてはいけません。
そのために、画面に文字を表示させる方法を学びます。
今回は「crack」と表示させてみましょう。
まず、ソースを見て下さい。


#include <stdio.h>

int main(){
        printf("crack"); /*画面に表示*/
        return 0; //mainから抜ける
}

だいたい解りますね?
#include <stdio.h>というのは、stdio.hと言うヘッダーを呼び出しています。
コレは、スタンダードインプットアウトプットの略で、標準的な入出力をする命令が書かれている物です。
それ以外の命令が必要な場合は、自分で追加しなければなりません。
基本的には、一番上に書いて下さい。
(stdio.hは、よく使う関数がいっぱい入っていますので、ほぼ毎回書くことになると思います。)

printf("crack");おわかりでしょうがこの部分で画面に文字を表示させています。
" "で囲まれている部分は、文字列で有ることを示しています。
' 'の場合は、文字です。(一文字の場合と言うことです。)
" "' 'は、表示の時や代入の時など、他でもよく使うので覚えておいて下さい。

さて、ソースファイルと同じ場所に実行ファイルが出来たと思いますが
コレを普段は、実行するわけです。
一度実行してみましょう。
実行してスグ画面が消えちゃうと言う方がいると思います。
CPad上から実行した時は、大丈夫でしたが、コレでは不都合です。
何故かというと、KGの場合IDから計算をしてパスを表示してもスグに終了してしまうと、
パスが読めないからです。
そんな場合は、
#include <conio.h>をstdio.hの下に追加して、printfの下にgetch();を追加してみて下さい。
conio.hはgetch()を使うために必要です。
getch()は、一時的に処理を停止したりする時に使います。(たぶん)

命令の後の/**///〜はコメントです。
プログラム自体には影響を与えませんが、ソースの意味をわかりやすくするために書きます。
/**/は複数行にまたがる場合や何かの間に入れたい場合、//は一行のみのコメントです。
//は使えないコンパイラもあるかもしれません。



それでは、次は入力です。。。。の前に、変数について勉強しましょう。
変数というのは、そこいらの入門書でも言われているように入れ物です。
(EAXやECXなどのレジスターと考えた方がわかりやすいかも・・・)
メモリ上のどこかに規定の分だけメモリを取得してくれます。
intは、正数を入れる箱    (インテンジャの略だったと思います)
charは、文字を入れる箱   (キャラクターの略だったと思います)
(charは文字を入れると書きましたが数字もいれれます。)
変数は、まとめて書いておくのが見やすく便利です。
,で区切り、こう宣言します。
(注意:変数は、最初になにかを代入しなければなりません。
  宣言した時点では、中身は空っぽなので計算したりすると何が起こるかわかりません。)


int x,y,z;
char moji,mretsu[5];


intの変数xyzが有り、charの変数、mojimretsu[5]が有ります。と言う意味です。
(ついでに、変数の名前は、半角ならなんでもいいです。)
は?って思われるかもしれませんが、そんな方は、後のプログラムを見て下さい。

宣言時に、最初の値がわかっている場合には
int a=0,b=100;
char moji='f',mretsu[5]="もじ";

こう書くことも出来ます。

さて、変数には色々付け加えたり出来る物があります。
たとえば、intは正数ですが、負の数も扱えます。
正の数だけでイイ!と言う場合には、unsignedを付け加えます。
unsigned int と言う感じです。
intの大きさは、環境によっても違うのですが2バイトだと-32768 〜 32767 の数を表せます。
unsignedにすると、0 〜 65535 です。(4バイトの場合もあります)
もっと大きな数字を扱いたい場合は、4バイトのlongを付け加えます。
long int となります。longだけでも大丈夫です。-2147483648 〜 2147483647の数を表せます。
unsignedにすると、0 〜 4294967295 です。
intが環境に左右されず、2バイトで使いたい場合は、longと同じ要領でshortを使います。

小数点を扱う場合は、intではなく、4バイトのfloatか、8バイトのdoubleを使います。


さて、charは、文字を扱います。
char moji;の場合は、mojiと言う変数に、一文字だけ格納できます。
文字列を扱う場合は、char mretsu[5]、このように宣言します。
分解すると、
mretsu[0]、mretsu[1]、mretsu[2]、mretsu[3]、mretsu[4]、mretsu[5]
となります。
mretsu[5]には、文字列の終わりがわかるように'\0'と言うのが入っています。
ですので、char mretsu[5];に格納できる文字数は、半角で5文字までと言うことになります。



さて、そろそろ入力の解説に行きます。
キーボードから、文字を入力して、それを画面に表示させます。


#include <stdio.h>

int main(){
	char moji[256];

	printf("文字を入力して下さい:");
	fgets(moji,256,stdin);
	printf("\n入力した文字は\n%sです。",moji);
	
	return 0;
}

まず、char moji[256];で256文字まで入力できる箱を作ります。
最初のprintfで、文字の入力を促すメッセージを表示させます。
fgetsで、文字を取得します。
fgets(char * , int , FILE *)、こう宣言されています。
char *は、入れる変数
intは、最大文字数
FILE *は、文字をどこから取得するか
です。
本来は、TEXTファイルなどから一行抜き出し変数に格納する命令なのですが、
ファイルをstdinにすると、キーボードで入力した文字が格納されます。
入力と言えば、scanf(const char *, ...)と言うのがあるのですが、
コレは、文字数を制限できません、と言うことは、規定より多い文字を入れてしまうと
メモリが破壊されていきます。
一応使い方は、、、文字列を取得するなら
scanf("%s",moji);
こんな使い方をします。数字なら
scanf("%d",&x);
こんな感じです。

あと、途中に\nが入っていますが、それは改行を表しています。
\0は、ヌル文字(文字列の最後など)
他の物は、必要になった時に説明します。

printfの途中に入っている%sは後ろのmojiを文字列として表示させると言うことです。
printf("%d %s %d",100,文字,200);
こうすると
100文字200
と表示されるはずです。
100や文字や200はもちろん普通は変数を書きますが(^^;



さて入出力は、これで出来ますので、次は計算です。
KGと言わずに色々なプログラムで計算は行います。

まず、これだけ覚えて下さい。
=,==,!=,<,>,<=,>=,+,++,-,--,*,/,%,&,|,^,<<,>>

+、-、*、/、はわかりますね?
足す、引く、かける、割る、です。
使い方は、
a+100;
などです。
%は、割った余りです。

++と--はINCとDECです。
a++;と書けばa+1と言う意味
a--;と書けばa-1と言う意味になります。
++a;や--a;
などの書き方もあります。優先順位の違いです。
まぁ、最初は気にしなくていいです。
++が最初に付く方が優先順位が高かったと思います。
そこの場所でなるべく早く計算して欲しいなら、最初に書けばいいでしょう(適当)

=は、代入する時に使います。

int a;
a = 100;
aに100を入れる、こういう使い方です。

a = 100;
a = a + 100;
これは、aに100を入れ、a(100)に100を足した物をaに入れます。
要するに、最後の時点でaは200になっています。わかりますか?
aの数字に100を足して、もう一度aに入れるという具合です。
a += 100;
こんな書き方も出来ます。
今あるaの数字に100を足してもう一度aに・・・って同じ事ですね(汗
(だいたいの計算は、こういう書き方が出来ます。
-= *= /= %= &= |= ^= >>= <<= など )

ですので、
a = 100;
a = 150;
a = 20;
こう言うのを書いた場合は、最後の時点でaには、20が入っています。
違う物を入れる時は、今ある物は取り出されてしまいます。

==!=<><=>=は、比較する物です。
a == 100
こう書けば、aは100かどうか調べます。逆に
a != 100
と、書けば、aは100ではないかどうかを調べてくれます。

<などは、説明しなくてよいですね(^^;
一応<は左の方が右より小さい
>は逆
<=は、左は右と同じかそれより小さい

&|^は、
論理積、論理和、排他的論理和、と言う物です。
ようするには
ANDとORとXORです。(わからない方はアセンブラ講座参照)

<<>>は、シフト命令です。
a << 4;
こう書くと、aの数字を左に4bitシフトします。
>>だと右に4bitです。
SHLとSHRと同じです。

さて、ROLRORが有りませんが、コレはstdlib.hとインクルードしなければなりません
使い方は、
#include <stdlib.h>
unsigned long a;
_lrotl(a , 8)
_lrotr(a , 4)
です。aを左に8bitローテートさせて、右に4bitローテートさせています。



さて、あと覚えるのは、ループと、条件分岐だけです。
while()から覚えましょう
while()は、無限ループです。
使い方は
while(条件){
}
スグ後ろの { 〜 } の間をループします。
条件に1を書いておけば、無限ループ間違い無しです。b(^^)
まぁ、txtから文字を読みとる場合
FILE *fp;             //ファイルを示す変数と思って下さい
fp = fopen("test.txt","r")   //それにファイルを指定します。
while(fgets(moji,256,fp){    //ループする度にfgets()を実行してファイルの最後でなければもう一度ループ
printf("%s",moji);        //取得した文字を表示
}                  //ループの終わりを教える
fclose(fp);            //ファイルを閉じる。
こんな使い方をすると思います。
ファイルの最後まできたら勝手にループから抜けてくれます。

do{ }while()ってのも有りますが、今回は使わないので却下!
簡単に言いますと、最低一回は{ }内の処理をします。
でwhile()の条件が合う限り{ }ないを処理します。


次のループはfor()です。
for(条件1;条件2;条件3){
}
とこんな書き方をします。これはよく使います。
例としては、同じ処理を数回繰り返す時に使います。例えば
int i;
for(i=0;i<5;i++){
printf("%d\n",i);
}
こんな使い方をします。
i=0の部分は、最初に一回だけ実行されるので、初期化処理を書きます。
i<5の部分は、比較しています。
要するには、iが5より小さければ、中の処理をすると言うことです。
ですので、同じになれば抜け出します。(<=の場合は5でも、処理します。)
i++の部分は、一回ループするごとに処理されます。
最初は、0、戻ってきたら、1になり、次は2と言う感じです。
ですので、上のソースを実行すると画面には、0〜4までの数字が表示されることになります。

ループから、途中で抜けたい場合はbreak;を使って下さい


最後にif()〜else文です。
if(条件){
}
で書きます。
if(i==1){
printf("iは1です。");
}
こんな感じです。
iが1の場合だけ、中の処理をします。
elseは、違ったら、と言う意味です。使い方は
if(i==2){
printf("iは2です。");
} else {
printf("iは2ではありません。");
}
こんな感じです。
さらに、他の条件も加えたい場合は
if(){
} else if(){
} else {
}
こんな使い方も出来ます。

これら{}で囲む物は、処理内容が一行なら省くことも出来ます。

if(i==2)
printf("iは2です。");

これでも、OK

では、最後に、色々使ってみましょう(^^;


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main(){
        int a=100,b=200,i; //宣言の時に数字なども入れれる
        char moji[5]="もじ"; //文字列を入れるならこうする
       
	for(i=0;i<5;i++){
		printf("%d回目のループ:aは%dです。\n",i+1,a);
		a += b;
		if(a==500){
			a+=10;
		} else if(a==710){
			a+=40;
		}
	}
	printf("次はwhileで同じ事をします。\nよろしければ何かキーを押して下さい\n\n");
	getch();

	//while()でforのように使ってみる
	i=0;				//初期化
	a=100;				//最初の数字に戻す
	b=200;
	while(1){
		if(i==5)break;		//iが5になれば抜け出す。(こういう書き方も出来る)
		printf("while:%d回目のループ:aは%dです。\n",i+1,a);
		a += b;
		if(a==500)		//一行だけなので{}はいらない
			a+=10;
		else if(a==710)
			a+=40;
		i++;			//ループの終わりでiに1を足す。
	}
	printf("同じ結果になりましたか?\n\n");
	getch();

	a = 0x60;			//0xを先頭に書けば16進数をして見なされる。
	printf("16進数の%xは10進数で%dです。\n",a,a);
	b = 255;
	printf("255を16進数で表すと%xです。大文字で表示すると%Xです。\n",b,b); //%xだと小文字で16進数、%Xだと大文字で16進数
	a= 0x5f;
	printf("16進数の「%x」を左に3bitローテートして見ましょう。\nこうなります。%x\n\n",a,_lrotl(a,3));
	printf("mojiは\"%s\"ですが、moji[1]をデクリメントすると",moji);		//\"は"です。代入する時や、表示する時は、\"を使います。
	moji[1]--;
	printf("\"%s\"こうなります。\n\n",moji);

	printf("以上終わりです");
	getch();
}

そういえば、忘れていましたが、Cは半角スペース、TAB、改行はいくらでも使って大丈夫です。
見やすくするために、空白をいっぱい作りましょう。(私は、つめまくり?:汗)
また、ココがわからなくても、KGを作っていくとわかることもあるので、とりあえず見てみましょう。

わからない部分や足りないなどが有れば、付け加えて説明していきます。
あと、間違っている部分はコッソリと(汗

どうしてもわからない方は、C言語のわかりやすい入門ページなども沢山あるので探してみて下さい。