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の変数xとyとzが有り、charの変数、mojiとmretsu[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と同じです。
さて、ROLとRORが有りませんが、コレは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言語のわかりやすい入門ページなども沢山あるので探してみて下さい。