読者です 読者をやめる 読者になる 読者になる

FLYING

〈全日本・紀文豆乳飲料シリーズ「麦芽コーヒー」の500ミリリットルパックを扱う小売店が少ないことに遺憾の意を表明する会〉活動記録

ビッグマックセット

c/c++

C言語

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

void tr(char *src, char *cmp, char *str)
{
	char *tmp, *index;
	int p_tmp, p_src;
	int len_before, len_after;
	
	index = strstr(src, cmp);
	if (!index) return;
	
	len_before = index - src;
	len_after = strlen(src) - len_before - strlen(cmp);
	tmp = malloc(len_before + strlen(str) + len_after + 1);
	
	p_tmp = p_src = 0;
	
	strncpy(tmp + p_tmp, src + p_src, len_before);
	p_tmp += len_before, p_src += len_before;
	strncpy(tmp + p_tmp, str, strlen(str));
	p_tmp += strlen(str), p_src += strlen(cmp);
	strncpy(tmp + p_tmp, src + p_src, len_after + 1);
	strncpy(src, tmp, len_before + strlen(str) + len_after + 1);
	
	free(tmp); /* ぎゃーす */
}

int main(void)
{
	int i;
	char context[10240] = "ビッグマックセット";
	
	for (i=0;i<100;i++) {
		printf("--- step %d ---\n", i+1);
		tr(context, "ビッグマックセット", "(ビッグマックセット + ポテトM + ドリンクM)");
		printf("%s\n", context);
	}
	
	return 0;
}

結果

--- step 1 ---
(ビッグマックセット + ポテトM + ドリンクM)
--- step 2 ---
((ビッグマックセット + ポテトM + ドリンクM) + ポテトM + ドリンクM)
--- step 3 ---
(((ビッグマックセット + ポテトM + ドリンクM) + ポテトM + ドリンクM) + ポテトM + ドリンクM)

以下略

系統分け

・ビッグマックセットは常識的に考えてビッグマック+ドリンク+ポテトだよ派
(クーポンの内容はビッグマックセットの定義じゃないよ派)
・ビッグマックセットはビッグマックセット+ドリンク+ポテトだよ派
(クーポンの内容がビッグマックセットの定義だよ派)
・ビッグマックセットの定義自体が次々に書き換わるよ派
(自己書き換え派)

ここでは真ん中の説を採用しています

反省

置換はもっとスマートに書けるんじゃね
めもりりーくこわい