C言語

stdout

stdoutは標準出力ストリームを表すマクロで、実態は標準出力を指すファイルポインタ。Man page of STDINfgetsで標準入力のstdinを使ったように、fputsで標準出力のstdoutを使ってみる。fputsの第2引数にstdoutを指定する。 fputsは改行しないので、'\n'を入…

isxdigit

isxdigitは、指定された文字が16進数で使われるa-f, A-F, 0-9であるかどうかを判定する。Man page of ISALPHA C言語関数辞典 - isxdigit入力された文字列が16進数の可能性があるかどうかをチェックしてみる。明らかに16進数でない場合は、"Not Hexadecimal."…

isupper

isupperは、指定された文字がアルファベットの大文字かどうかを判定する。Man page of ISALPHA C言語関数辞典 - isupperここまでくると、ただ大文字かどうかを判定するのではつまらない。 パスワードに適した文字列かどうかを判定してみる。アルファベットで…

islower

islowerは、指定された文字がアルファベットの小文字かどうかを判定する。Man page of ISALPHA C言語関数辞典 - islower小文字が含まれているか判定する。islowerの前に、一応isalphaもかけているが、これはいらないかも。 $ ./islower ABCDE Not a lower al…

isalnum

isalnumは、指定された文字がアルファベットまたは数字かどうかを判定する。Man page of ISALPHA C言語関数辞典 - isalnumアルファベットでもない数字でもない記号などの文字が含まれているかをチェックする。isalnumが偽であれば、記号などの文字が含まれて…

isdigit

isdigitは、指定された文字が数字かどうかを判定する。Man page of ISALPHA C言語関数辞典 - isdigit入力された文字列の中に数字が入っているかどうかをチェックするプログラムをつくる。 (パスワードチェックなどの基本となるような処理を作ってみる。)fget…

puts

putsは指定された文字列に改行を付加して標準出力に出力する。Man page of PUTS C言語関数辞典 - puts (putsの引数がchar *になっているのは間違いで、正しくはconst char *のはず。)改行が付加されるところに注意。文字列リテラルと文字配列、両方試してみ…

stdin

stdinは標準入力ストリームを表すマクロで、実態は標準入力を指すファイルポインタ。Man page of STDINこれを使って、fgetsの処理を標準入力で行う。getsの代わりになる。fgetsの第3引数にstdinを指定し、標準入力から文字列を読み込む。 最後に改行が入って…

gets

getsは入力された文字列を指定された配列などに格納する。Man page of GETS C言語関数辞典 - getsスペースで区切られることがないので、scanfより最後まで文字列を取得したい場合に使う。 ただし、セキュリティ上の問題から、この関数は非推奨になっている。…

isalpha

isalphaは、指定された文字がアルファベットかどうかを判定する。Man page of ISALPHA C言語関数辞典 - isalphaisalpha.cで、getcharで入力された文字を取得し、cに代入。 isalphaにcを渡して、真なら"Alphabet"、偽なら"Not Alphabet"、と出力する。 $ vi i…

getchar

getcharは、標準入力から入力された文字を取得できる。Man page of FGETC C言語関数辞典 - getchargetchar.cで、入力フォームを作って、int型で返ってくるので、int型変数icに格納。 その後、char型にもキャストして、char型変数ccにも代入。 icは整数値とし…

putchar

putcharは、指定された文字を標準出力に出力する。Man page of PUTS C言語関数辞典 - putcharputchar.cで、putcharの引数の型はintであることに注意。 文字リテラルの型もintである。 もちろんchar型でも基本的には問題ない。基本的には・・・。 (特殊な例を…

atoi

atoiは、整数値の文字列を整数型に変換する。Man page of ATOI C言語関数辞典 - atoiatoi.cで、入力された文字列をscanfで文字配列strに格納し、atoiで整数型に変換、戻り値を整数型変数iに格納する。 $ vi atoi.c $ gcc atoi.c -o atoi $ ./atoi str: 1 i =…

assert

assertは、コードの診断に使うもので、ある式を評価し、それが偽であれば、そのプログラムを中止する。Man page of ASSERTassert.cで、 x >= 0 という式を診断するので、xが-1以下なら、プログラムが中止となる。 $ vi assert.c $ gcc assert.c -o assert $ …

perror

perrorは、OSが返すシステムエラーメッセージを出力する。Man page of PERRORシステムコールっぽいが標準関数。 perror.cで、存在しないファイルを開こうとしてわざと失敗させる。 $ vi perror.c $ gcc perror.c -o perror $ ./perror fopen error!: No such…

#if文

#if文は、プリプロセッサディレクティブのひとつで、指定されたマクロの値が真(true)の時、#endifまでのプログラムが有効となりコンパイル対象となる・・・。 偽(false)の時は、コンパイル対象にならないので、実行もされない・・・。 つまり、コメントアウ…

#define文

#define文は、プリプロセッサディレクティブのひとつで、プログラム中の指定した文字列を別の文字列に置換する・・・。 こういうのをマクロといい、さまざまなマクロを#define文で定義できる・・・。今回は数値と文字列の定数マクロを定義する・・・。INT_TE…

#include文

#include文は、プリプロセッサディレクティブのひとつで、指定されたファイルを取り込むという命令・・・。プリプロセッサは、コンパイル前に行う前処理をする機能で、プリプロセッサが行う命令をプリプロセッサディレクティブという・・・。 (なのでプリプ…

関数ポインタ

変数がアドレスを持ち、変数のアドレスを格納する変数がポインタであるように、関数もアドレスを持ち、関数のアドレスを格納する変数を関数ポインタという・・・。 <戻り値型> (*<関数ポインタ名>)(<引数型>, <引数型>, ...); 関数ポインタはこんな風に宣言…

voidポインタ

voidポインタ(void *)は、さまざまなポインタ型にキャストでき、逆にどんな型のポインタでもvoidポインタにキャストできる・・・。これで状況に応じて、さまざまな型に対応した関数が定義できる・・・。funcはvoidポインタと渡す型のサイズを受け取る・・・…

ポインタへのポインタ

ポインタは、変数のアドレスを持つ変数・・・。 ということは、そのポインタへのポインタを定義することも可能・・・。 int **pp; このように宣言すれば、ppはint型変数へのポインタを格納するポインタになる・・・。 これを使った2つの例を示す・・・。まず…

ビットフィールド

C言語における変数のサイズは最小でもcharの1バイト、8bit分はある・・・。 それに対し、真か偽かを保持するなら1bitで十分である・・・。 こういう場合に、なんとかしてbit単位でメモリ領域を割り当てられないだろうか・・・。C言語の構造体にはビットフィ…

共用体

共用体は、構造体に似ているが、要素1つ1つにメモリ領域が割り当てられているのではなく、複数の要素が1つのメモリ領域を共有している・・・。今回は、union_userという共用体を定義・・・。 構造体struct_user_nは、nameだけ・・・。 構造体struct_user_na…

列挙型

列挙型はいくつかのマクロ定数をまとめたようなもので、列挙型の変数はこのマクロ定数群のうちのどれかを値に取る・・・。例えば、 enum TEST{ TARO, JIRO, SABURO }; enum Test test; という感じで、TESTの定義とtestの宣言をした場合、testの値はTARO, JIR…

typedef

typedefは、既存の型に新しい型名を付けるときに使う・・・。 typdef <元の型名> <新しい型名> このように使う・・・。例えば、unsigned charという型をbyteという型として定義できる・・・。 unsigned charがなくなったわけではなく、byteという型は実際はu…

可変引数

printfのように、呼び出し側で引数の数や型を決めるような関数を作ることができる・・・。 引数が呼び出し側で可変なので可変引数という・・・。可変引数を扱うには、stdarg.hというヘッダファイルをインクルードする必要がある・・・。例えば、今回は指定さ…

main関数の引数

プログラムを実行するときに、オプションとしてパラメータを渡すことができる・・・。 $ ./program abc例えば、このようにprogramに"abc"という文字列を渡せる・・・。 これをコマンドライン引数ともいい、これはmain関数の引数として渡されるので、 int mai…

再帰関数

関数の中で、再びその関数自身を呼び出すことができ、こういう関数を再帰関数と呼ぶ・・・。 これを使うことで、ループ処理をより簡潔に記述できる・・・。渡された値を階乗した値を返す関数factorialを定義する・・・。その前にmain関数は、こうなっている…

ブロック

ブロックは、'{'と'}'で囲んだ場所のこと・・・。 関数や、if文、for文など、処理をまとめたところにはほとんど必ずといっていいほど使われている・・・。ブロックの先頭で宣言した変数は、そのブロックの末尾を抜けるまで有効であり、値が保持されていて、…

sizeof演算子

ストックがなくなったので、久しぶりにC言語のSampleの続きを・・・。sizeof演算子は、型、変数、ポインタ、配列、構造体、式などのサイズを返す演算子・・・。 sizeof よく括弧でくくるので、 sizeof() こんな感じで関数みたいに見えることが多いが演算子・…