読者です 読者をやめる 読者になる 読者になる

#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() こんな感じで関数みたいに見えることが多いが演算子・…

Hello, world!(C言語)

新生Test・・・。 逆引きのような形でやっていこうと思う・・・。 順番もSampleよりは自由にやってこうと思う・・・。まずは、"Hello, world!"のC言語版・・・。printfで・・・。 $ vi helloworld.c $ gcc helloworld.c -o helloworld $ ./helloworld Hello,…

キャスト演算子

キャスト演算子は、指定された型にキャスト(型変換)する演算子・・・。式の値や変数が違う型同士の場合、暗黙的なキャストのルールによって、同じ型になるように変換される・・・。ただし、指定した型に強制的に変換したい場合はキャスト演算子を使って変換…

ビット演算子

単一の整数値、または2つの整数値同士は、ビット演算子を使ってビット演算が可能である・・・。まずは、入力されたa, bの値を2進数のビット列で出力する・・・。 2で割った余りを下の桁から文字配列に入れていく感じ・・・。 (今回はintのa, bを8桁2進数で表…

論理演算子

if文などの条件式で条件と条件を繋げたり、条件を否定する条件にしたりする時、論理演算子を使う・・・。論理和(OR)の演算子("||")を使って、 A || B は「AまたはB」というような意味・・・。 どちらかが満たされていればいい・・・。aが10より大きい、また…

const

const修飾子を変数宣言で型の前に付けると、値が変更できない変数(つまり定数)となる・・・。 const <型> <変数名> 例えば、 /* ヘッダファイルのインクルード */ #include <stdio.h> /* 標準入出力 */ /* main関数の定義 */ int main(void){ /* 変数の初期化 */ int </stdio.h>…

exit

exitは、指定した終了コードでプログラムを終了するC標準ライブラリ関数・・・。Man page of EXITmain関数の中のreturn文と基本的には同じ・・・。 ただ、これを使えば、任意の他の関数からプログラムを終了できる・・・。 異常時の強制終了とかに使う・・・…

外部変数

グローバル変数は、そのモジュール内ならどこでも参照、代入が可能な変数であった・・・。 では、別のモジュールからその変数を参照したり、代入したりする場合はどうすればいいのか?このような場合は、参照したい別モジュールで、参照したい変数をexternを…

スタティック変数

スタティック変数は、関数などのブロック内部のみアクセス可能だが、そのブロックを抜けても変数の値を保持する性質を持つ・・・。今回は、関数内部に3つの変数を宣言し、関数が呼ばれるたびにその値がどう変化するかを見ていく・・・。スタティック変数を含…

グローバル変数

基本的に変数は、if文や、for文、関数などブロック("{"と"}")で囲まれた範囲(これをスコープという)でのみ有効であり、 外からそこにアクセスすることはできないし、そのブロックを抜けると値も保持される保証は無い・・・。グローバル変数は、そのモジュー…

clock

clockは、CPUがとある処理にかかった時間を計測するためのC標準ライブラリ関数・・・。Man page of CLOCKclock_tはプロセッサ時間単位なので、秒単位の結果を得るには、 開始と終了のclock_tの差をCLOCKS_PER_SECで割ればいい・・・。前回のループ処理(iを0…

difftime

difftimeは2つの時刻の差を求めるC標準ライブラリ関数・・・。Man page of DIFFTIME戻り値はdoubleで返る・・・。これを使って、とある処理にかかる時間を計測する・・・。 といっても、変数iを0から1000000になるまで足し合わせるだけだが・・・。開始時刻s…

mktime

mktimeは、ローカル時刻が格納されているtm構造体の時刻情報をUNIX時間へ変換し、time_t型変数として返すC標準ライブラリ関数・・・。Man page of CTIMEここまでで、time: time_tを取得 localtime: time_t -> tm構造体 asctime: tm構造体 -> 時刻文字列 strp…

strftime

strftimeは、tm構造体の時刻情報を指定のフォーマットに従って時刻文字列に変換し、指定のバッファに格納するC標準ライブラリ関数・・・。Man page of STRFTIMEstrptimeは、時刻文字列をパース -> tm構造体に格納なのに対し、strftimeは、tm構造体 -> 指定の…

ctime

ctimeは、指定されたtime_t型変数のUNIX時間を直接ローカル時刻文字列に変換し、その文字列ポインタを返すC標準ライブラリ関数・・・。Man page of CTIMEこれまではlocaltimeでtm構造体への変換を経由していたが、これを使って直接ローカル時刻文字列を取得…

asctime

asctimeは、指定されたtm構造体の時刻情報を時刻文字列に変換し、その文字列ポインタを返すC標準ライブラリ関数・・・。Man page of CTIME前回までのように、printfにtm構造体の各要素を指定することなく、時刻文字列にできるので、これを使って時刻文字列を…

localtime

localtimeは、指定されたtime_t型変数のUNIX時間をローカル時刻に変換し、 時刻情報をtm構造体に格納するC標準ライブラリ関数・・・。Man page of CTIMEローカル時刻、つまり日本なら日本時間(JST)に変換できるので、これで日本の時刻文字列を表示する・・・…

gmtime

gmtimeは、指定されたtime_t型変数のUNIX時間をグリニッジ標準時の時刻に変換し、 時刻情報をtm構造体に格納するC標準ライブラリ関数・・・。 (これ自身はシステムコールではないが、timeシステムコールに関連するライブラリ関数なので、このカテゴリで扱う…

time

timeは、「UNIX時間」と呼ばれる時刻を表す数値を返すUNIXシステムコール、およびC標準ライブラリ関数・・・。Man page of TIMEUNIX時間は、UTC(協定世界時)における1970年1月1日0時0分0秒からの経過秒数であり、time_t型の数値として表わされる・・・。 tim…

ftell

ftellは指定されたファイルの現在のアクセス位置を取得するC標準ライブラリ関数・・・。Man page of FSEEKの2番目がftell・・・。 引数はファイルポインタだけ・・・。 戻り値に、先頭からのアクセス位置がlongの値で返ってくる・・・。fseekの頁ではprof.bi…

fseek

fseekは指定されたファイルのアクセス位置をセットするC標準ライブラリ関数・・・。Man page of FSEEKの1番目がfseek・・・。 ファイルポインタ、基準位置から何バイト目か、基準位置(先頭からなのか、末尾からなのか、など)、って感じで指定する・・・。こ…

fread

freadは指定されたファイルなどのストリームから、指定サイズのデータを読み込み、指定のメモリ領域に格納するC標準ライブラリ関数・・・。Man page of FREADの1番目がfread・・・。 バイナリファイルから、変数、配列、構造体にデータを格納するとき使う・…

fwrite

fwriteは指定されたメモリ領域のデータを指定されたサイズ分、ファイルなどのストリームに出力するC標準ライブラリ関数・・・。Man page of FREADの2番目がfwrite・・・。 一般的には、変数や配列、構造体などをバイナリデータのままファイルに書き込むとき…

input_str_form

trim_left_lfでfgetsの末尾の改行問題が解決したので、これで入力フォーム関数input_str_formが作れる・・・。 #include <stdio.h> #include <string.h> int trim_left_lf(char *str); void input_str_form(char *caption, char *buf, int size); captionは入力フォームのタイト</string.h></stdio.h>…

trim_left_lf

プログラムの中で、標準入力から入力されたコマンドや文字列を取得する場合、C言語ではscanf、gets、fgetsなどを使って取得するのが、一般的だ・・・。しかし、scanfは文字列中に空白などがあると、文字列が切れてしまう・・・。スペース区切りで複数のパラ…

fputs

fputsは指定された文字列をファイルなどのストリームに出力するC標準ライブラリ関数・・・。Man page of PUTSの2番目がfputs・・・。 指定文字列を標準出力へ出力するputsをベースにしている・・・。 第1引数に出力する文字列、第2引数にファイルポインタを…

fgets

fgetsはファイルなどの指定されたストリームから1行分の文字列を読み込んで、指定の文字配列に格納するC標準ライブラリ関数・・・。Man page of FGETCの2番目がfgets・・・。 標準入力から1行読み込むgetsをベースにしているが、getsはセキュリティ上の問題…

malloc

mallocは、指定されたサイズのメモリを動的に割り当てるC標準ライブラリ関数・・・。Man page of MALLOC引数には、割り当てるメモリのサイズを指定する・・・。 戻り値には、割り当てたメモリ領域の先頭アドレスが返ってくる・・・。これを使って、int型の動…

strcmp

strcmpは文字列同士を比較し、どちらがASCIIコード順で先か後かを判定する・・・。Man page of STRCMP戻り値が負の値の場合は、第1引数の文字列が先、 戻り値が正の値の場合は、第2引数の文字列が先、 戻り値が0の場合は、2つの文字列は等しいと判定する・・…

strcat

strcatは、文字列を別の文字配列の末尾に連結するC標準ライブラリ関数・・・。Man page of STRCAT第1引数に連結先の文字配列、第2引数に連結元の文字列を指定する・・・。 後ろから前に連結・・・。 コピー先の文字配列はNULL終端である(NULL文字で終わって…

strcpy

strcpyは、文字列を別の文字配列にコピーするC標準ライブラリ関数・・・。Man page of STRCPY第1引数にコピー先の文字配列、第2引数にコピー元の文字列を指定する・・・。 後ろから前にコピーという感じ・・・。 コピー先の文字配列は、コピー元の文字列、そ…

strlen

strlenは、文字列の長さを取得するC標準ライブラリ関数・・・。Man page of STRLEN引数に対象となる文字列(文字列リテラルや文字配列)を指定すると、戻り値として文字列の長さをバイト数で返す・・・。 文字列の長さとは言ったが、バイト単位で返すので文字…

文字列

これまでも散々扱ってきた文字列について改めて・・・。文字列は、 文字列リテラル 文字配列 に分けられる・・・。文字列リテラルは、任意のメモリが確保され、それぞれの文字が指定の文字に固定される・・・。 プログラム中でメモリを確保していないので、…

fscanf

fscanfはファイルから読み込んだデータを、指定の書式に基づいて、指定の変数や配列などに格納するC標準ライブラリ関数・・・。Man page of SCANFの2番目がfscanf、ファイルポインタ以外はscanfと同じ・・・。"test.txt"からスペース区切りのデータを読み込…

fprintf

fprintfは指定された書式でファイルに出力するC標準ライブラリ関数・・・。Man page of PRINTFの2番目にあるのがfprintfで、名前の通りprintfのようにファイルに出力できる・・・。"test.txt"に、入力された名前(name)、年齢(age)、住所(address)、を出力す…

fopen

ファイルに読み書きをするには、まず"開く"という行為をしなければならない・・・。fopenは指定されたファイル名のファイルを開くC標準ライブラリ関数・・・。Man page of FOPENここでは"test.txt"というテキストファイルを開いてみる・・・。ファイルへの入…

構造体

いくつかの異なる型の要素をまとめて、1つの新しい型として扱うことができるのが、構造体・・・。ここでは、名前、年齢、住所(といっても都道府県ぐらいでいいが)という3つの要素を、1つにまとめた簡易名簿の構造体を定義し、その構造体の変数各要素に入力さ…

ポインタ

ポインタは、変数のアドレスを格納するための変数・・・。たいていの変数は、メモリ上に割り当てられているので、そのメモリのアドレスがわかれば値にアクセスできる・・・。 そのメモリのアドレスを格納することができるのがポインタと呼ばれる特殊な変数・…