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文字を扱うには、メモリが何バイト必要なのか?
・コマンドライン引数で好きな値を渡せるようにする
ご指摘、質問などあれば、是非是非お待ちしております!
じゃまた、ヨロシク勇気!!
この記事が気に入ったらサポートをしてみませんか?