文字種判別とかアドレスの参照とか(C学習中)

今日覚えたこと

文字種判別の関数いろいろ
  • 制御文字: iscntrl
  • 空白文字を含む表示文字: isprint
  • 空白文字を含まない表示文字: isgraph
  • 10進数字: isdigit
  • 16進数字: isxdigit
  • 英大文字; isupper
  • 英小文字: islower
  • 英数字: isalnum
  • 英数字でも空白でもない表示文字: ispunct
  • 空白類文字: isspace

・・・を判別する関数が、存在する。

数字文字と整数値の変換

整数値に'0'(のコード)を加えて、数字文字のコードを得る。

参照渡し

呼び出し元では、引数の値に&演算子をつけて、関数に渡す。呼び出された関数側では、仮引数で間接演算子(*)を適用した変数を宣言して、受け取ったアドレスを参照する。

呼び出した先の関数でアレコレ値をいじった後、呼び出し元に戻ってくる。(アドレスではなく)値の中身を見るときは、&演算子をつけなくてよい。

わかったような、わからないようなこと

// (略)
int hoge;
char moga[];

scanf("%d", &hoge);
scanf("%s", moga);
// (略)

なぜint型の変数に値を受け取るときは&が必要なのに、文字配列に受け取るときは&が不要なのか。

原則として、配列名は、その配列の先頭要素へのポインタとして解釈される。

柴田望洋:『詳解C言語 ポインタ完全攻略』,p.50,ソフトバンククリエイティブ,2009.6.

&hogeでは、変数hogeのアドレスを取り出していて、mogaでは、配列mogaの先頭のアドレスを取り出している。つまり、やってることは同じである(表記が違うだけ)と思ってよいのかな・・・

わからないこと

入力文字列を英数字のみに制限したいときは、実際、文字種判別関数を組み合わせて対処するのでしょうか。

たとえば、英数字でも空白でもない表示文字の判別にispunct関数を使うことを知ったけれど、実用上、特殊文字の判別用途に、この関数をそのまま使ってもよいのか。それとも、何か別の手段を使うのかしらん。