Objective-Cをやっていくにあたって、やはりC言語は必須。
てか、よく考えたらプログラムに興味を持ったのって、友達の家でC言語の本を開いて変数の仕組みを知ったのがきっかけだったことを思い出した。一周回った感w
コマンドライン引数の取り扱い
$ ./hoge a.txt 3
みたいな形で指定した場合に、プログラム側での取り扱いについてです。
// argcが引数の数
// argvが実際に渡された文字列(ただし、argv[0]は`./hoge`が入る)
int main(int argc, char *argv[]) {
if (argc != 3) {
// 想定している引数ではない
return 0;
}
char *test = argv[1];
printf("%s", test); // => a.txt
return 0;
}
文字列を整数値に変換
上記のようにコマンドラインで値を受け取ると、すべて文字列扱いになってしまいます。
数字を指定してなにか処理をしたい場合は、文字列を数値にしなければなりません。
atoiを使う
以下のようにすることで変換することができます。
# include <stdlib.h>
// 略
char *arg = argv[1];
int i = atoi(arg);
配列数の計算
イディオム的な。
int data[5] = {0, 1, 2, 3, 4};
int length = sizeof(data) / sizeof(data[0]);
// あるいは明示的に型を渡す
int length = sizeof(data) / sizeof(int);
enum型の宣言について
enum型はややこいのでまとめておく。
enum型にはいくつか宣言の方法があって、以下のような感じ。
- enum E { e1, e2 };
- enum E { e1, e2 } e;
- enum { e1, e2 } e;
- typedef enum E { e1, e2 } OtherE;
- typedef enum { e1, e2 } E;
意味を理解すればなんてことはないですが、最初はなにがなんだか分かりませんね。
それぞれまとめると以下の意味になります。
enum型の宣言
//タグEを使って宣言
enum E { e1, e2 };
int main(void)
{
enum E hoge = e1;
printf("%d", hoge); //=>0
}
使うところを見てもらうと分かるけど、enum E
という型で、hoge
という変数名を宣言している。
値は列挙したe1
を初期化時に代入している。
無名enum型の宣言
次に無名のenum型。
enum { e1, e2 };
int main(void)
{
enum { e1, e2 } hoge = e1;
printf("%d", hoge);
}
サンプルを見れば「無名」の意味が分かると思う。
最初の例はE
というタグがついていたのでタグ名で型宣言できたけど、無名のため列挙した内容自体も型宣言に含めないとならない、という点が違う。
宣言と同時に変数宣言
enum { e1, e2 } hoge = e1;
int main(void)
{
printf("%d", hoge);
}
こちらは無名enum型+変数宣言の組み合わせ。
宣言すると同時に変数hoge
にe1
を代入している。
= e1
を省略して宣言することもできる。(これは普通の変数宣言と同じ)
typedefパターン1
typedef enum E { e1, e2 } OtherE;
int main(void)
{
OtherE hoge = e1;
printf("%d", hoge); //=>0
enum E fuga = e2;
printf("%d", fuga); //=>1
}
こちらはtypedef
を使った型定義の例。
int
などと同じようにOtherE
という型だけで宣言ができる。
さらに通常のタグ名による宣言も可能になっているのが分かると思う。
宣言と同時に変数宣言するパターンと若干、書式が似ているので分かりづらいけど、typedefを使った方は変数名ではなく型定義名になる。
typedefパターン2
typedef enum { e1, e2 } OtherE;
int main(void)
{
OtherE hoge = e1;
printf("%d", hoge); //=>0
}
こちらはタグ名を省略した形。
ただ、typedef
により型定義されているので短く宣言できる。
基本的にはこれを使うので問題ないと思う。