14
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C言語についてメモ

Last updated at Posted at 2014-02-22

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型の宣言

enum1.c
//タグEを使って宣言
enum E { e1, e2 };

int main(void)
{
	enum E hoge = e1;
	printf("%d", hoge); //=>0
}

使うところを見てもらうと分かるけど、enum Eという型で、hogeという変数名を宣言している。
値は列挙したe1を初期化時に代入している。

無名enum型の宣言

次に無名のenum型。

enum2.c
enum { e1, e2 };

int main(void)
{
	enum { e1, e2 } hoge = e1;
	printf("%d", hoge);
}

サンプルを見れば「無名」の意味が分かると思う。
最初の例はEというタグがついていたのでタグ名で型宣言できたけど、無名のため列挙した内容自体も型宣言に含めないとならない、という点が違う。

宣言と同時に変数宣言

enum3.c
enum { e1, e2 } hoge = e1;

int main(void)
{
	printf("%d", hoge);
}

こちらは無名enum型+変数宣言の組み合わせ。
宣言すると同時に変数hogee1を代入している。
= e1を省略して宣言することもできる。(これは普通の変数宣言と同じ)

typedefパターン1

enum4.c
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

enum5.c
typedef enum { e1, e2 } OtherE;

int main(void)
{
	OtherE hoge = e1;
	printf("%d", hoge); //=>0
}

こちらはタグ名を省略した形。
ただ、typedefにより型定義されているので短く宣言できる。
基本的にはこれを使うので問題ないと思う。

14
22
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?