C言語のwrite関数で、縦に"風林火山"って書ける?

 #include  <stdio.h> #include  <unistd.h> #include  <string.h>

int my_strlen(char *str)
{
	size_t len = 0;
	while (str[len] != '\0')
	{
		len++;
	}
	return (len);
}

void print_str(char *str)
{
	size_t i = 0;
	while (i <= my_strlen(str))
	{
		write(1, str, 3);
		i = i + 1;
		str = str + 3;
	}
	write(1, "\n", 1);
}

int main(int argc, char **argv)
{
	char *str = "風林火山";

	print_str(str);
	return (0);
}
gcc test.c
./a.out

まずはファイルtest.cを作る。とりあえず横に表示するとして、上記のようなこんなコードだろうか。
そしてgccでコンパイルして./a.outで実行する。

そしたら本題の、縦出力の仕方を考えてみよう。


 #include  <stdio.h> #include  <string.h> #include  <unistd.h>

char *print_str(char *str)
{
	int i = 0;
	printf("strlen(str) = %lu\n", strlen(str));
	int limit = strlen(str) + 3;
	printf("limit = %d\n", limit);
	while (i <= (limit / 4))
	{
		write(1, str, 3);
		str += 3;
		i++;
		write(1, "\n" ,1);
	}
	return (str);
}

int main(int argc, char **argv)
{
	char *str = argv[1];

	if (argv[1] == 0)
		str = "風林火山";
	char *res = print_str(str);
	return (0);
}

うん、うまく旗みたいに縦にできたな!
コマンドライン引数も渡せるようになっているから、以下のようにコンパイルして、実行すると、旗指物に好きな文言を入れれるゼ!

gcc test.c
./a.out 八幡大菩薩

今回のポイントは、
・文字型配列の長さをカウントするstrlen関数を自作
・日本語1文字を扱うには、メモリが何バイト必要なのか?
・コマンドライン引数で好きな値を渡せるようにする

ご指摘、質問などあれば、是非是非お待ちしております!
じゃまた、ヨロシク勇気!!

この記事が気に入ったらサポートをしてみませんか?