#始めに
先週辺りに、「◎◎で湯婆婆を~」というのが流行ってました。今となっては遅いですが、「入力文字列からランダムに一文字選んで表示する」と捉え、練習のつもりで作ってみました。
#環境
PC-9821Cx + TurboC++1.01 + vz1.6 + ms-dos6.2
ちなみにODP(DX66MHz相当)を積んでます。今回は関係ないですけど。
#コード
yubaba.c
/***********************************
yubaba.c
> tcc yubaba
***********************************/
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <string.h>
#define MES1 "湯婆婆:契約書だよ。そこに名前を書きな。\n\r"
#define MES2 "湯婆婆:フン、%s というのかい。贅沢な名だねえ。\n\r"
#define MES3 "湯婆婆:今からおまえの名は %s だ。いいかい、%s だよ。\n\r"
#define MES4 "湯婆婆:分かったら返事をするんだ、%s !!\n\r"
int main()
{
char name[256],new_name[3];
int len;
float r;
struct time t;
gettime(&t);
srand(t.ti_hour*100+t.ti_min*10+t.ti_sec);
printf(MES1);
printf(" 名前を全角で> ");
gets(name);
len = (int)strlen(name)/2;
r = 1+rand()%len;
if (r >= len) r-=2;
new_name[0]=name[2*r];
new_name[1]=name[2*r+1];
new_name[2]=NULL;
printf(MES2,name);
printf(MES3,new_name,new_name);
printf(MES4,new_name);
return len;
}
#実行例
B:\SRC\C\TEXT>yubaba
湯婆婆:契約書だよ。そこに名前を書きな。
名前を全角で> アブドーラ・ザ・ブッチャー
湯婆婆:フン、アブドーラ・ザ・ブッチャー というのかい。贅沢な名だねえ。
湯婆婆:今からおまえの名は ャ だ。いいかい、ャ だよ。
湯婆婆:分かったら返事をするんだ、ャ !!
B:\SRC\C\TEXT>yubaba
湯婆婆:契約書だよ。そこに名前を書きな。
名前を全角で> ジャイアント馬場
湯婆婆:フン、ジャイアント馬場 というのかい。贅沢な名だねえ。
湯婆婆:今からおまえの名は ト だ。いいかい、ト だよ。
湯婆婆:分かったら返事をするんだ、ト !!
B:\SRC\C\TEXT>yubaba
湯婆婆:契約書だよ。そこに名前を書きな。
名前を全角で> キン肉マン
湯婆婆:フン、キン肉マン というのかい。贅沢な名だねえ。
湯婆婆:今からおまえの名は 肉 だ。いいかい、肉 だよ。
湯婆婆:分かったら返事をするんだ、肉 !!
B:\SRC\C\TEXT>yubaba
湯婆婆:契約書だよ。そこに名前を書きな。
名前を全角で> テリーマン
湯婆婆:フン、テリーマン というのかい。贅沢な名だねえ。
湯婆婆:今からおまえの名は マ だ。いいかい、マ だよ。
湯婆婆:分かったら返事をするんだ、マ !!
#考えたこと
- 「入力文字列の○文字目だけを選んで表示する」のは簡単にできた。
- 漢字は2バイトで1文字を表す。乱数で適当に文字(実際は○バイト目)を選んだ場合、偶数バイトが最初に来ると、漢字コードが正しく選ばれない状態になり、まったく違う漢字になってしまった。ので、乱数で発生させた数値は必ず奇数バイト目になるようにした。
- srand()のランダムシードの作り方、もっと効率いい方法ないですか?私はプログラムの基本を全く知らない・・・。
- もっといい方法があるかもしれません。includeファイルは、これでいいんでしょうか?検証する気がないです。